list.go
1 package model 2 3 import ( 4 "encoding/json" 5 "fmt" 6 ) 7 8 type ListRepliesPolicy int 9 10 const ( 11 ListRepliesPolicyFollowed ListRepliesPolicy = iota 12 ListRepliesPolicyList 13 ListRepliesPolicyNone 14 ListRepliesPolicyUnknown 15 ) 16 17 const ( 18 listRepliesPolicyFollowedValue = "followed" 19 listRepliesPolicyListValue = "list" 20 listRepliesPolicyNoneValue = "none" 21 ) 22 23 func (l ListRepliesPolicy) String() string { 24 policyMap := map[ListRepliesPolicy]string{ 25 ListRepliesPolicyFollowed: listRepliesPolicyFollowedValue, 26 ListRepliesPolicyList: listRepliesPolicyListValue, 27 ListRepliesPolicyNone: listRepliesPolicyNoneValue, 28 } 29 30 output, ok := policyMap[l] 31 if !ok { 32 return unknownValue 33 } 34 35 return output 36 } 37 38 func ParseListRepliesPolicy(value string) (ListRepliesPolicy, error) { 39 policyMap := map[string]ListRepliesPolicy{ 40 listRepliesPolicyFollowedValue: ListRepliesPolicyFollowed, 41 listRepliesPolicyListValue: ListRepliesPolicyList, 42 listRepliesPolicyNoneValue: ListRepliesPolicyNone, 43 } 44 45 output, ok := policyMap[value] 46 if !ok { 47 return ListRepliesPolicyUnknown, InvalidListRepliesPolicyError{value} 48 } 49 50 return output, nil 51 } 52 53 func (l ListRepliesPolicy) MarshalJSON() ([]byte, error) { 54 value := l.String() 55 if value == unknownValue { 56 return nil, InvalidListRepliesPolicyError{value} 57 } 58 59 data, err := json.Marshal(value) 60 if err != nil { 61 return nil, fmt.Errorf("unable to encode %s to JSON: %w", value, err) 62 } 63 64 return data, nil 65 } 66 67 func (l *ListRepliesPolicy) UnmarshalJSON(data []byte) error { 68 var ( 69 value string 70 err error 71 ) 72 73 if err = json.Unmarshal(data, &value); err != nil { 74 return fmt.Errorf("unable to decode the JSON data: %w", err) 75 } 76 77 *l, err = ParseListRepliesPolicy(value) 78 if err != nil { 79 return err 80 } 81 82 return nil 83 } 84 85 type InvalidListRepliesPolicyError struct { 86 Value string 87 } 88 89 func (e InvalidListRepliesPolicyError) Error() string { 90 return "'" + 91 e.Value + 92 "' is not a valid list replies policy: valid values are " + 93 listRepliesPolicyFollowedValue + ", " + 94 listRepliesPolicyListValue + ", " + 95 listRepliesPolicyNoneValue 96 } 97 98 type List struct { 99 ID string `json:"id"` 100 RepliesPolicy ListRepliesPolicy `json:"replies_policy"` 101 Title string `json:"title"` 102 Exclusive bool `json:"exclusive"` 103 Accounts map[string]string `json:"-"` 104 }