From d660081f3ecd2735764b8fdd9c3e5d534cb4f414 Mon Sep 17 00:00:00 2001 From: Dan Anglin Date: Sun, 2 Jun 2024 09:50:22 +0100 Subject: [PATCH] checkpoint: moved InvalidStatusVisibilityError to model package --- internal/executor/create.go | 6 ++--- internal/executor/errors.go | 8 ------- internal/model/list.go | 2 +- internal/model/status_visibility.go | 34 +++++++++++++++++++++++------ 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/internal/executor/create.go b/internal/executor/create.go index 9da207b..7385d03 100644 --- a/internal/executor/create.go +++ b/internal/executor/create.go @@ -168,9 +168,9 @@ func (c *CreateExecutor) createStatus(gtsClient *client.Client) error { sensitive = preferences.PostingDefaultSensitive } - parsedVisibility := model.ParseStatusVisibility(visibility) - if parsedVisibility == model.StatusVisibilityUnknown { - return InvalidStatusVisibilityError{Visibility: visibility} + parsedVisibility, err := model.ParseStatusVisibility(visibility) + if err != nil { + return err } parsedContentType := model.ParseStatusContentType(c.contentType) diff --git a/internal/executor/errors.go b/internal/executor/errors.go index d6650fa..54fd190 100644 --- a/internal/executor/errors.go +++ b/internal/executor/errors.go @@ -59,14 +59,6 @@ func (e EmptyContentError) Error() string { return message } -type InvalidStatusVisibilityError struct { - Visibility string -} - -func (e InvalidStatusVisibilityError) Error() string { - return "'" + e.Visibility + "' is an invalid status visibility (valid values are public, unlisted, private, mutuals_only and direct)" -} - type InvalidStatusContentTypeError struct { ContentType string } diff --git a/internal/model/list.go b/internal/model/list.go index 8820c03..c4c044e 100644 --- a/internal/model/list.go +++ b/internal/model/list.go @@ -77,7 +77,7 @@ func (l *ListRepliesPolicy) UnmarshalJSON(data []byte) error { ) if err = json.Unmarshal(data, &value); err != nil { - return fmt.Errorf("unable to unmarshal the data; %w", err) + return fmt.Errorf("unable to decode the JSON data; %w", err) } *l, err = ParseListRepliesPolicy(value) diff --git a/internal/model/status_visibility.go b/internal/model/status_visibility.go index 1474925..84bd76a 100644 --- a/internal/model/status_visibility.go +++ b/internal/model/status_visibility.go @@ -45,7 +45,7 @@ func (s StatusVisibility) String() string { return output } -func ParseStatusVisibility(value string) StatusVisibility { +func ParseStatusVisibility(value string) (StatusVisibility, error) { mapped := map[string]StatusVisibility{ statusVisibilityPublicValue: StatusVisibilityPublic, statusVisibilityPrivateValue: StatusVisibilityPrivate, @@ -56,19 +56,24 @@ func ParseStatusVisibility(value string) StatusVisibility { output, ok := mapped[value] if !ok { - return StatusVisibilityUnknown + return StatusVisibilityUnknown, InvalidStatusVisibilityError{Value: value} } - return output + return output, nil } 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 nil, InvalidStatusVisibilityError{Value: value} } - return json.Marshal(value) + data, err := json.Marshal(value) + if err != nil { + return nil, fmt.Errorf("unable to encode %s to JSON: %w", value, err) + } + + return data, nil } func (s *StatusVisibility) UnmarshalJSON(data []byte) error { @@ -78,10 +83,25 @@ func (s *StatusVisibility) UnmarshalJSON(data []byte) error { ) if err = json.Unmarshal(data, &value); err != nil { - return fmt.Errorf("unable to unmarshal the data; %w", err) + return fmt.Errorf("unable to decode the JSON data; %w", err) } - *s = ParseStatusVisibility(value) + // Ignore the error if the visibility from another service is + // not known by enbas. It will be replaced with 'unknown'. + *s, _ = ParseStatusVisibility(value) return nil } + +type InvalidStatusVisibilityError struct { + Value string +} + +func (e InvalidStatusVisibilityError) Error() string { + return "'" + e.Value + "' is not a valid status visibility value (valid values are " + + statusVisibilityPublicValue + ", " + + statusVisibilityUnlistedValue + ", " + + statusVisibilityPrivateValue + ", " + + statusVisibilityMutualsOnlyValue + ", " + + statusVisibilityDirectValue + ")" +}