summaryrefslogtreecommitdiff
path: root/internal/federation/dereferencing/error.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/federation/dereferencing/error.go')
-rw-r--r--internal/federation/dereferencing/error.go132
1 files changed, 132 insertions, 0 deletions
diff --git a/internal/federation/dereferencing/error.go b/internal/federation/dereferencing/error.go
new file mode 100644
index 000000000..4e5d1cd22
--- /dev/null
+++ b/internal/federation/dereferencing/error.go
@@ -0,0 +1,132 @@
+/*
+ GoToSocial
+ Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package dereferencing
+
+import (
+ "errors"
+ "fmt"
+
+ "github.com/superseriousbusiness/gotosocial/internal/transport"
+)
+
+// ErrDB denotes that a proper error has occurred when doing
+// a database call, as opposed to a simple db.ErrNoEntries.
+type ErrDB struct {
+ wrapped error
+}
+
+func (err *ErrDB) Error() string {
+ return fmt.Sprintf("database error during dereferencing: %v", err.wrapped)
+}
+
+func newErrDB(err error) error {
+ return &ErrDB{wrapped: err}
+}
+
+// ErrNotRetrievable denotes that an item could not be dereferenced
+// with the given parameters.
+type ErrNotRetrievable struct {
+ wrapped error
+}
+
+func (err *ErrNotRetrievable) Error() string {
+ return fmt.Sprintf("item could not be retrieved: %v", err.wrapped)
+}
+
+func newErrNotRetrievable(err error) error {
+ return &ErrNotRetrievable{wrapped: err}
+}
+
+// ErrBadRequest denotes that insufficient or improperly formed parameters
+// were passed into one of the dereference functions.
+type ErrBadRequest struct {
+ wrapped error
+}
+
+func (err *ErrBadRequest) Error() string {
+ return fmt.Sprintf("bad request: %v", err.wrapped)
+}
+
+func newErrBadRequest(err error) error {
+ return &ErrBadRequest{wrapped: err}
+}
+
+// ErrTransportError indicates that something unforeseen went wrong creating
+// a transport, or while making an http call to a remote resource with a transport.
+type ErrTransportError struct {
+ wrapped error
+}
+
+func (err *ErrTransportError) Error() string {
+ return fmt.Sprintf("transport error: %v", err.wrapped)
+}
+
+func newErrTransportError(err error) error {
+ return &ErrTransportError{wrapped: err}
+}
+
+// ErrWrongType indicates that an unexpected type was returned from a remote call;
+// for example, we were served a Person when we were looking for a statusable.
+type ErrWrongType struct {
+ wrapped error
+}
+
+func (err *ErrWrongType) Error() string {
+ return fmt.Sprintf("wrong received type: %v", err.wrapped)
+}
+
+func newErrWrongType(err error) error {
+ return &ErrWrongType{wrapped: err}
+}
+
+// ErrOther denotes some other kind of weird error, perhaps from a malformed json
+// or some other weird crapola.
+type ErrOther struct {
+ wrapped error
+}
+
+func (err *ErrOther) Error() string {
+ return fmt.Sprintf("unexpected error: %v", err.wrapped)
+}
+
+func newErrOther(err error) error {
+ return &ErrOther{wrapped: err}
+}
+
+func wrapDerefError(derefErr error, fluff string) error {
+ var (
+ err error
+ errWrongType *ErrWrongType
+ )
+
+ if fluff != "" {
+ err = fmt.Errorf("%s: %w", fluff, derefErr)
+ }
+
+ switch {
+ case errors.Is(derefErr, transport.ErrGone):
+ err = newErrNotRetrievable(err)
+ case errors.As(derefErr, &errWrongType):
+ err = newErrWrongType(err)
+ default:
+ err = newErrTransportError(err)
+ }
+
+ return err
+}