diff --git a/internal/model/list.go b/internal/model/list.go index 04c6cbc..d22df3c 100644 --- a/internal/model/list.go +++ b/internal/model/list.go @@ -26,7 +26,7 @@ func ParseListRepliesPolicy(policy string) (ListRepliesPolicy, error) { return ListRepliesPolicyNone, nil } - return ListRepliesPolicy(-1), errors.New("invalid list replies policy") + return ListRepliesPolicy(-1), fmt.Errorf("%q is not a valid list replies policy", policy) } func (l ListRepliesPolicy) String() string { @@ -43,12 +43,12 @@ func (l ListRepliesPolicy) String() string { } func (l ListRepliesPolicy) MarshalJSON() ([]byte, error) { - str := l.String() - if str == "" { + value := l.String() + if value == "" { return nil, errors.New("invalid list replies policy") } - return json.Marshal(str) + return json.Marshal(value) } func (l *ListRepliesPolicy) UnmarshalJSON(data []byte) error { diff --git a/internal/model/status.go b/internal/model/status.go index 1a3f725..5bed74a 100644 --- a/internal/model/status.go +++ b/internal/model/status.go @@ -1,6 +1,7 @@ package model import ( + "encoding/json" "fmt" "time" @@ -36,7 +37,7 @@ type Status struct { Text string `json:"text"` URI string `json:"uri"` URL string `json:"url"` - Visibility string `json:"visibility"` + Visibility StatusVisibility `json:"visibility"` } type Card struct { @@ -82,34 +83,34 @@ type PollOption struct { } type StatusReblogged struct { - Account Account `json:"account"` - Application Application `json:"application"` - Bookmarked bool `json:"bookmarked"` - Card Card `json:"card"` - Content string `json:"content"` - CreatedAt time.Time `json:"created_at"` - Emojis []Emoji `json:"emojis"` - Favourited bool `json:"favourited"` - FavouritesCount int `json:"favourites_count"` - ID string `json:"id"` - InReplyToAccountID string `json:"in_reply_to_account_id"` - InReplyToID string `json:"in_reply_to_id"` - Language string `json:"language"` - MediaAttachments []Attachment `json:"media_attachments"` - Mentions []Mention `json:"mentions"` - Muted bool `json:"muted"` - Pinned bool `json:"pinned"` - Poll Poll `json:"poll"` - Reblogged bool `json:"reblogged"` - RebloggsCount int `json:"reblogs_count"` - RepliesCount int `json:"replies_count"` - Sensitive bool `json:"sensitive"` - SpolierText string `json:"spoiler_text"` - Tags []Tag `json:"tags"` - Text string `json:"text"` - URI string `json:"uri"` - URL string `json:"url"` - Visibility string `json:"visibility"` + Account Account `json:"account"` + Application Application `json:"application"` + Bookmarked bool `json:"bookmarked"` + Card Card `json:"card"` + Content string `json:"content"` + CreatedAt time.Time `json:"created_at"` + Emojis []Emoji `json:"emojis"` + Favourited bool `json:"favourited"` + FavouritesCount int `json:"favourites_count"` + ID string `json:"id"` + InReplyToAccountID string `json:"in_reply_to_account_id"` + InReplyToID string `json:"in_reply_to_id"` + Language string `json:"language"` + MediaAttachments []Attachment `json:"media_attachments"` + Mentions []Mention `json:"mentions"` + Muted bool `json:"muted"` + Pinned bool `json:"pinned"` + Poll Poll `json:"poll"` + Reblogged bool `json:"reblogged"` + RebloggsCount int `json:"reblogs_count"` + RepliesCount int `json:"replies_count"` + Sensitive bool `json:"sensitive"` + SpolierText string `json:"spoiler_text"` + Tags []Tag `json:"tags"` + Text string `json:"text"` + URI string `json:"uri"` + URL string `json:"url"` + Visibility StatusVisibility `json:"visibility"` } type Tag struct { @@ -195,3 +196,72 @@ func (s Status) String() string { s.URL, ) } + +type StatusVisibility int + +const ( + StatusVisibilityPublic StatusVisibility = iota + StatusVisibilityPrivate + StatusVisibilityUnlisted + StatusVisibilityMutualsOnly + StatusVisibilityDirect + StatusVisibilityUnknown +) + +func (s StatusVisibility) String() string { + switch s { + case StatusVisibilityPublic: + return "public" + case StatusVisibilityPrivate: + return "private" + case StatusVisibilityUnlisted: + return "unlisted" + case StatusVisibilityMutualsOnly: + return "mutuals_only" + case StatusVisibilityDirect: + return "direct" + } + + return "unknown" +} + +func ParseStatusVisibility(visibility string) (StatusVisibility, error) { + switch visibility { + case "public": + return StatusVisibilityPublic, nil + case "private": + return StatusVisibilityPrivate, nil + case "unlisted": + return StatusVisibilityUnlisted, nil + case "mutuals_only": + return StatusVisibilityMutualsOnly, nil + case "direct": + return StatusVisibilityDirect, nil + } + + return StatusVisibilityUnknown, nil +} + +func (s StatusVisibility) MarshalJSON() ([]byte, error) { + value := s.String() + if value == "unknown" { + return nil, fmt.Errorf("%q is not a valid status visibility", value) + } + + return json.Marshal(value) +} + +func (s *StatusVisibility) UnmarshalJSON(data []byte) error { + var ( + value string + err error + ) + + if err = json.Unmarshal(data, &value); err != nil { + return fmt.Errorf("unable to unmarshal the data; %w", err) + } + + *s, _ = ParseStatusVisibility(value) + + return nil +}