package db import ( "fmt" "strings" ) type WordStatus string const ( StatusUnknown WordStatus = "" StatusFavourite WordStatus = "favourite" StatusOkay WordStatus = "okay" StatusJokingly WordStatus = "jokingly" StatusFriendsOnly WordStatus = "friends_only" StatusAvoid WordStatus = "avoid" ) func (w *WordStatus) UnmarshalJSON(src []byte) error { if string(src) == "null" { return nil } s := strings.Trim(string(src), `"`) switch s { case "1": *w = "favourite" case "2": *w = "okay" case "3": *w = "jokingly" case "4": *w = "friends_only" case "5": *w = "avoid" default: *w = WordStatus(s) } return nil } func (w WordStatus) Valid(extra ...WordStatus) bool { if w == StatusFavourite || w == StatusOkay || w == StatusJokingly || w == StatusFriendsOnly || w == StatusAvoid { return true } for i := range extra { if w == extra[i] { return true } } return false } type FieldEntry struct { Value string `json:"value"` Status WordStatus `json:"status"` } func (fe FieldEntry) Validate() string { if fe.Value == "" { return "value cannot be empty" } if len([]rune(fe.Value)) > FieldEntryMaxLength { return fmt.Sprintf("name must be %d characters or less, is %d", FieldEntryMaxLength, len([]rune(fe.Value))) } if !fe.Status.Valid() { return "status is invalid" } return "" } type PronounEntry struct { Pronouns string `json:"pronouns"` DisplayText *string `json:"display_text"` Status WordStatus `json:"status"` } func (p PronounEntry) Validate() string { if p.Pronouns == "" { return "pronouns cannot be empty" } if p.DisplayText != nil { if len([]rune(*p.DisplayText)) > FieldEntryMaxLength { return fmt.Sprintf("display_text must be %d characters or less, is %d", FieldEntryMaxLength, len([]rune(*p.DisplayText))) } } if len([]rune(p.Pronouns)) > FieldEntryMaxLength { return fmt.Sprintf("pronouns must be %d characters or less, is %d", FieldEntryMaxLength, len([]rune(p.Pronouns))) } if !p.Status.Valid() { return "status is invalid" } return "" } func (p PronounEntry) String() string { if p.DisplayText != nil { return *p.DisplayText } split := strings.Split(p.Pronouns, "/") if len(split) <= 2 { return strings.Join(split, "/") } return strings.Join(split[:1], "/") }