/ internal / model / list.go
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  }