checkpoint: add a type for representing the enum values of status visibility

This commit is contained in:
Dan Anglin 2024-05-29 23:46:12 +01:00
parent e73dbb45ed
commit 5f24a68ca9
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638
2 changed files with 103 additions and 33 deletions

View file

@ -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 {

View file

@ -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
}