2024-05-30 18:46:33 +01:00
|
|
|
package model
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
|
|
|
type StatusVisibility int
|
|
|
|
|
|
|
|
const (
|
|
|
|
StatusVisibilityPublic StatusVisibility = iota
|
|
|
|
StatusVisibilityPrivate
|
|
|
|
StatusVisibilityUnlisted
|
|
|
|
StatusVisibilityMutualsOnly
|
|
|
|
StatusVisibilityDirect
|
|
|
|
StatusVisibilityUnknown
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
statusVisibilityPublicValue = "public"
|
|
|
|
statusVisibilityPrivateValue = "private"
|
|
|
|
statusVisibilityUnlistedValue = "unlisted"
|
|
|
|
statusVisibilityMutualsOnlyValue = "mutuals_only"
|
|
|
|
statusVisibilityDirectValue = "direct"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (s StatusVisibility) String() string {
|
|
|
|
mapped := map[StatusVisibility]string{
|
|
|
|
StatusVisibilityPublic: statusVisibilityPublicValue,
|
|
|
|
StatusVisibilityPrivate: statusVisibilityPrivateValue,
|
|
|
|
StatusVisibilityUnlisted: statusVisibilityUnlistedValue,
|
|
|
|
StatusVisibilityMutualsOnly: statusVisibilityMutualsOnlyValue,
|
|
|
|
StatusVisibilityDirect: statusVisibilityDirectValue,
|
|
|
|
}
|
|
|
|
|
|
|
|
output, ok := mapped[s]
|
|
|
|
if !ok {
|
|
|
|
return unknownValue
|
|
|
|
}
|
|
|
|
|
|
|
|
return output
|
|
|
|
}
|
|
|
|
|
2024-06-02 11:35:43 +01:00
|
|
|
func ParseStatusVisibility(value string) (StatusVisibility, error) {
|
2024-05-30 18:46:33 +01:00
|
|
|
mapped := map[string]StatusVisibility{
|
|
|
|
statusVisibilityPublicValue: StatusVisibilityPublic,
|
|
|
|
statusVisibilityPrivateValue: StatusVisibilityPrivate,
|
|
|
|
statusVisibilityUnlistedValue: StatusVisibilityUnlisted,
|
|
|
|
statusVisibilityMutualsOnlyValue: StatusVisibilityMutualsOnly,
|
|
|
|
statusVisibilityDirectValue: StatusVisibilityDirect,
|
|
|
|
}
|
|
|
|
|
|
|
|
output, ok := mapped[value]
|
|
|
|
if !ok {
|
2024-06-02 11:35:43 +01:00
|
|
|
return StatusVisibilityUnknown, InvalidStatusVisibilityError{Value: value}
|
2024-05-30 18:46:33 +01:00
|
|
|
}
|
|
|
|
|
2024-06-02 11:35:43 +01:00
|
|
|
return output, nil
|
2024-05-30 18:46:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s StatusVisibility) MarshalJSON() ([]byte, error) {
|
|
|
|
value := s.String()
|
|
|
|
if value == unknownValue {
|
2024-06-02 11:35:43 +01:00
|
|
|
return nil, InvalidStatusVisibilityError{Value: value}
|
|
|
|
}
|
|
|
|
|
|
|
|
data, err := json.Marshal(value)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("unable to encode %s to JSON: %w", value, err)
|
2024-05-30 18:46:33 +01:00
|
|
|
}
|
|
|
|
|
2024-06-02 11:35:43 +01:00
|
|
|
return data, nil
|
2024-05-30 18:46:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *StatusVisibility) UnmarshalJSON(data []byte) error {
|
|
|
|
var (
|
|
|
|
value string
|
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
if err = json.Unmarshal(data, &value); err != nil {
|
2024-06-02 11:35:43 +01:00
|
|
|
return fmt.Errorf("unable to decode the JSON data: %w", err)
|
2024-05-30 18:46:33 +01:00
|
|
|
}
|
|
|
|
|
2024-06-02 11:35:43 +01:00
|
|
|
// Ignore the error if the visibility from another service is
|
|
|
|
// not known by enbas. It will be replaced with 'unknown'.
|
|
|
|
*s, _ = ParseStatusVisibility(value)
|
2024-05-30 18:46:33 +01:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
2024-06-02 11:35:43 +01:00
|
|
|
|
|
|
|
type InvalidStatusVisibilityError struct {
|
|
|
|
Value string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e InvalidStatusVisibilityError) Error() string {
|
|
|
|
return "'" + e.Value + "' is not a valid status visibility value: valid values are " +
|
|
|
|
statusVisibilityPublicValue + ", " +
|
|
|
|
statusVisibilityUnlistedValue + ", " +
|
|
|
|
statusVisibilityPrivateValue + ", " +
|
|
|
|
statusVisibilityMutualsOnlyValue + ", " +
|
|
|
|
statusVisibilityDirectValue
|
|
|
|
}
|