use hash maps instead of switch statements

This commit is contained in:
Dan Anglin 2024-05-30 09:44:59 +01:00
parent d2c7377627
commit d7d0e111d7
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638
4 changed files with 143 additions and 109 deletions

5
internal/model/const.go Normal file
View file

@ -0,0 +1,5 @@
package model
const (
unknownValue = "unknown"
)

View file

@ -1,7 +1,6 @@
package model package model
import ( import (
"encoding/json"
"fmt" "fmt"
"time" "time"
@ -196,111 +195,3 @@ 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(value string) StatusVisibility {
switch value {
case "public":
return StatusVisibilityPublic
case "private":
return StatusVisibilityPrivate
case "unlisted":
return StatusVisibilityUnlisted
case "mutuals_only":
return StatusVisibilityMutualsOnly
case "direct":
return StatusVisibilityDirect
}
return StatusVisibilityUnknown
}
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
}
type StatusContentType int
const (
StatusContentTypePlainText StatusContentType = iota
StatusContentTypeMarkdown
StatusContentTypeUnknown
)
func (s StatusContentType) String() string {
switch s {
case StatusContentTypePlainText:
return "text/plain"
case StatusContentTypeMarkdown:
return "text/markdown"
}
return "unknown"
}
func ParseStatusContentType(value string) StatusContentType {
switch value {
case "plain", "text/plain":
return StatusContentTypePlainText
case "markdown", "text/markdown":
return StatusContentTypeMarkdown
}
return StatusContentTypeUnknown
}
func (s StatusContentType) MarshalJSON() ([]byte, error) {
value := s.String()
if value == "unknown" {
return nil, fmt.Errorf("%q is not a valid status content type", value)
}
return json.Marshal(value)
}

View file

@ -0,0 +1,55 @@
package model
import (
"encoding/json"
"fmt"
)
type StatusContentType int
const (
StatusContentTypePlainText StatusContentType = iota
StatusContentTypeMarkdown
StatusContentTypeUnknown
)
const (
statusContentTypeTextPlainValue = "text/plain"
statusContentTypePlainValue = "plain"
statusContentTypeTextMarkdownValue = "text/markdown"
statusContentTypeMarkdownValue = "markdown"
)
func (s StatusContentType) String() string {
mapped := map[StatusContentType]string{
StatusContentTypeMarkdown: statusContentTypeTextMarkdownValue,
StatusContentTypePlainText: statusContentTypeTextPlainValue,
}
output, ok := mapped[s]
if !ok {
return unknownValue
}
return output
}
func ParseStatusContentType(value string) StatusContentType {
switch value {
case statusContentTypePlainValue, statusContentTypeTextPlainValue:
return StatusContentTypePlainText
case statusContentTypeMarkdownValue, statusContentTypeTextMarkdownValue:
return StatusContentTypeMarkdown
}
return StatusContentTypeUnknown
}
func (s StatusContentType) MarshalJSON() ([]byte, error) {
value := s.String()
if value == unknownValue {
return nil, fmt.Errorf("%q is not a valid status content type", value)
}
return json.Marshal(value)
}

View file

@ -0,0 +1,83 @@
package model
import (
"encoding/json"
"fmt"
)
type StatusVisibility int
const (
StatusVisibilityPublic StatusVisibility = iota
StatusVisibilityPrivate
StatusVisibilityUnlisted
StatusVisibilityMutualsOnly
StatusVisibilityDirect
StatusVisibilityUnknown
)
const (
statusVisibilityPublicValue = "public"
statusVisibilityPrivateValue = "private"
statusVisibilityUnlistedValue = "unlisted"
statusVisibilityMutualsOnlyValue = "mutuals_only"
statusVisibilityDirectValue = "direct"
)
func (s StatusVisibility) String() string {
mapped := map[StatusVisibility]string{
StatusVisibilityPublic: statusVisibilityPublicValue,
StatusVisibilityPrivate: statusVisibilityPrivateValue,
StatusVisibilityUnlisted: statusVisibilityUnlistedValue,
StatusVisibilityMutualsOnly: statusVisibilityMutualsOnlyValue,
StatusVisibilityDirect: statusVisibilityDirectValue,
}
output, ok := mapped[s]
if !ok {
return unknownValue
}
return output
}
func ParseStatusVisibility(value string) StatusVisibility {
mapped := map[string]StatusVisibility{
statusVisibilityPublicValue: StatusVisibilityPublic,
statusVisibilityPrivateValue: StatusVisibilityPrivate,
statusVisibilityUnlistedValue: StatusVisibilityUnlisted,
statusVisibilityMutualsOnlyValue: StatusVisibilityMutualsOnly,
statusVisibilityDirectValue: StatusVisibilityDirect,
}
output, ok := mapped[value]
if !ok {
return StatusVisibilityUnknown
}
return output
}
func (s StatusVisibility) MarshalJSON() ([]byte, error) {
value := s.String()
if value == unknownValue {
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
}