enbas/internal/model/list.go

104 lines
2.2 KiB
Go
Raw Normal View History

package model
import (
"encoding/json"
"fmt"
)
type ListRepliesPolicy int
const (
ListRepliesPolicyFollowed ListRepliesPolicy = iota
ListRepliesPolicyList
ListRepliesPolicyNone
ListRepliesPolicyUnknown
)
const (
listRepliesPolicyFollowedValue = "followed"
listRepliesPolicyListValue = "list"
listRepliesPolicyNoneValue = "none"
)
func (l ListRepliesPolicy) String() string {
mapped := map[ListRepliesPolicy]string{
ListRepliesPolicyFollowed: listRepliesPolicyFollowedValue,
ListRepliesPolicyList: listRepliesPolicyListValue,
ListRepliesPolicyNone: listRepliesPolicyNoneValue,
}
output, ok := mapped[l]
if !ok {
return unknownValue
}
return output
}
func ParseListRepliesPolicy(value string) (ListRepliesPolicy, error) {
mapped := map[string]ListRepliesPolicy{
listRepliesPolicyFollowedValue: ListRepliesPolicyFollowed,
listRepliesPolicyListValue: ListRepliesPolicyList,
listRepliesPolicyNoneValue: ListRepliesPolicyNone,
}
output, ok := mapped[value]
if !ok {
return ListRepliesPolicyUnknown, InvalidListRepliesPolicyError{value}
}
return output, nil
}
func (l ListRepliesPolicy) MarshalJSON() ([]byte, error) {
value := l.String()
if value == unknownValue {
return nil, InvalidListRepliesPolicyError{value}
}
data, err := json.Marshal(value)
if err != nil {
return nil, fmt.Errorf("unable to encode %s to JSON: %w", value, err)
}
return data, nil
}
func (l *ListRepliesPolicy) UnmarshalJSON(data []byte) error {
var (
value string
err error
)
if err = json.Unmarshal(data, &value); err != nil {
return fmt.Errorf("unable to decode the JSON data: %w", err)
}
*l, err = ParseListRepliesPolicy(value)
if err != nil {
return err
}
return nil
}
type InvalidListRepliesPolicyError struct {
Value string
}
func (e InvalidListRepliesPolicyError) Error() string {
return "'" +
e.Value +
"' is not a valid list replies policy: valid values are " +
listRepliesPolicyFollowedValue + ", " +
listRepliesPolicyListValue + ", " +
listRepliesPolicyNoneValue
}
type List struct {
ID string `json:"id"`
RepliesPolicy ListRepliesPolicy `json:"replies_policy"`
Title string `json:"title"`
Accounts map[string]string
}