enbas/internal/model/list.go
Dan Anglin bc18c00c69
feat: add ability to interact with lists
Add the ability to create, update, list and delete lists.

Note, adding accounts or removing them from lists is not scoped
in this PR.
2024-02-27 19:52:59 +00:00

89 lines
1.7 KiB
Go

package model
import (
"encoding/json"
"errors"
"fmt"
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
)
type ListRepliesPolicy int
const (
ListRepliesPolicyFollowed ListRepliesPolicy = iota
ListRepliesPolicyList
ListRepliesPolicyNone
)
func ParseListRepliesPolicy(policy string) (ListRepliesPolicy, error) {
switch policy {
case "followed":
return ListRepliesPolicyFollowed, nil
case "list":
return ListRepliesPolicyList, nil
case "none":
return ListRepliesPolicyNone, nil
}
return ListRepliesPolicy(-1), errors.New("invalid list replies policy")
}
func (l ListRepliesPolicy) String() string {
switch l {
case ListRepliesPolicyFollowed:
return "followed"
case ListRepliesPolicyList:
return "list"
case ListRepliesPolicyNone:
return "none"
}
return ""
}
func (l ListRepliesPolicy) MarshalJSON() ([]byte, error) {
str := l.String()
if str == "" {
return nil, errors.New("invalid list replies policy")
}
return json.Marshal(str)
}
func (l *ListRepliesPolicy) 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)
}
*l, err = ParseListRepliesPolicy(value)
if err != nil {
return fmt.Errorf("unable to parse %s as a list replies policy; %w", value, err)
}
return nil
}
type List struct {
ID string `json:"id"`
RepliesPolicy ListRepliesPolicy `json:"replies_policy"`
Title string `json:"title"`
}
func (l List) String() string {
format := `%s %s
%s %s
%s %s`
return fmt.Sprintf(
format,
utilities.FieldFormat("List ID:"), l.ID,
utilities.FieldFormat("Title:"), l.Title,
utilities.FieldFormat("Replies Policy:"), l.RepliesPolicy,
)
}