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 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 { func (l ListRepliesPolicy) String() string {
@ -43,12 +43,12 @@ func (l ListRepliesPolicy) String() string {
} }
func (l ListRepliesPolicy) MarshalJSON() ([]byte, error) { func (l ListRepliesPolicy) MarshalJSON() ([]byte, error) {
str := l.String() value := l.String()
if str == "" { if value == "" {
return nil, errors.New("invalid list replies policy") return nil, errors.New("invalid list replies policy")
} }
return json.Marshal(str) return json.Marshal(value)
} }
func (l *ListRepliesPolicy) UnmarshalJSON(data []byte) error { func (l *ListRepliesPolicy) UnmarshalJSON(data []byte) error {

View file

@ -1,6 +1,7 @@
package model package model
import ( import (
"encoding/json"
"fmt" "fmt"
"time" "time"
@ -36,7 +37,7 @@ type Status struct {
Text string `json:"text"` Text string `json:"text"`
URI string `json:"uri"` URI string `json:"uri"`
URL string `json:"url"` URL string `json:"url"`
Visibility string `json:"visibility"` Visibility StatusVisibility `json:"visibility"`
} }
type Card struct { type Card struct {
@ -109,7 +110,7 @@ type StatusReblogged struct {
Text string `json:"text"` Text string `json:"text"`
URI string `json:"uri"` URI string `json:"uri"`
URL string `json:"url"` URL string `json:"url"`
Visibility string `json:"visibility"` Visibility StatusVisibility `json:"visibility"`
} }
type Tag struct { type Tag struct {
@ -195,3 +196,72 @@ func (s Status) String() string {
s.URL, 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
}