summaryrefslogtreecommitdiff
path: root/internal/gtserror/error.go
blob: bd83a8dc8075ccd8feeaa4a5f5b97fb10584a5e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
// GoToSocial
// Copyright (C) GoToSocial Authors admin@gotosocial.org
// SPDX-License-Identifier: AGPL-3.0-or-later
//
// 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 gtserror

import (
	"codeberg.org/gruf/go-errors/v2"
)

// package private error key type.
type errkey int

// ErrorType denotes the type of an error, if set.
type ErrorType string

const (
	// error value keys.
	_ errkey = iota
	statusCodeKey
	notFoundKey
	errorTypeKey
	unrtrvableKey
	wrongTypeKey
	smtpKey
	malformedKey
	notRelevantKey
	spamKey
	notPermittedKey
	limitReachedKey
)

// LimitReached indicates that this error was caused by
// some kind of limit being reached, e.g. media upload limit.
func LimitReached(err error) bool {
	_, ok := errors.Value(err, limitReachedKey).(struct{})
	return ok
}

// SetLimitReached will wrap the given error to store a "limit reached"
// flag, returning wrapped error. See LimitReached() for example use-cases.
func SetLimitReached(err error) error {
	return errors.WithValue(err, limitReachedKey, struct{}{})
}

// IsUnretrievable indicates that a call to retrieve a resource
// (account, status, attachment, etc) could not be fulfilled, either
// because it was not found locally, or because some prerequisite
// remote resource call failed, making it impossible to return it.
func IsUnretrievable(err error) bool {
	_, ok := errors.Value(err, unrtrvableKey).(struct{})
	return ok
}

// SetUnretrievable will wrap the given error to store an "unretrievable"
// flag, returning wrapped error. See Unretrievable() for example use-cases.
func SetUnretrievable(err error) error {
	return errors.WithValue(err, unrtrvableKey, struct{}{})
}

// NotPermitted indicates that some call failed due to failed permission
// or acceptibility checks. For example an attempt to dereference remote
// status in which the status author does not have permission to reply
// to the status it is intended to be replying to.
func NotPermitted(err error) bool {
	_, ok := errors.Value(err, notPermittedKey).(struct{})
	return ok
}

// SetNotPermitted will wrap the given error to store a "not permitted"
// flag, returning wrapped error. See NotPermitted() for example use-cases.
func SetNotPermitted(err error) error {
	return errors.WithValue(err, notPermittedKey, struct{}{})
}

// IsWrongType checks error for a stored "wrong type" flag.
// Wrong type indicates that an ActivityPub URI returned a
// type we weren't expecting. For example:
//
//   - HTML instead of JSON.
//   - Normal JSON instead of ActivityPub JSON.
//   - Statusable instead of Accountable.
//   - Accountable instead of Statusable.
//   - etc.
func IsWrongType(err error) bool {
	_, ok := errors.Value(err, wrongTypeKey).(struct{})
	return ok
}

// SetWrongType will wrap the given error to store a "wrong type" flag,
// returning wrapped error. See IsWrongType() for example use-cases.
func SetWrongType(err error) error {
	return errors.WithValue(err, wrongTypeKey, struct{}{})
}

// StatusCode checks error for a stored status code value. For example
// an error from an outgoing HTTP request may be stored, or an API handler
// expected response status code may be stored.
func StatusCode(err error) int {
	i, _ := errors.Value(err, statusCodeKey).(int)
	return i
}

// WithStatusCode will wrap the given error to store provided status code,
// returning wrapped error. See StatusCode() for example use-cases.
func WithStatusCode(err error, code int) error {
	return errors.WithValue(err, statusCodeKey, code)
}

// IsNotFound checks error for a stored "not found" flag. For
// example an error from an outgoing HTTP request due to DNS lookup.
func IsNotFound(err error) bool {
	_, ok := errors.Value(err, notFoundKey).(struct{})
	return ok
}

// SetNotFound will wrap the given error to store a "not found" flag,
// returning wrapped error. See IsNotFound() for example use-cases.
func SetNotFound(err error) error {
	return errors.WithValue(err, notFoundKey, struct{}{})
}

// IsSMTP checks error for a stored "smtp" flag. For
// example an error from outgoing SMTP email attempt.
func IsSMTP(err error) bool {
	_, ok := errors.Value(err, smtpKey).(struct{})
	return ok
}

// SetSMTP will wrap the given error to store an "smtp" flag,
// returning wrapped error. See IsSMTP() for example use-cases.
func SetSMTP(err error) error {
	return errors.WithValue(err, smtpKey, struct{}{})
}

// IsMalformed checks error for a stored "malformed" flag. For
// example an error from an incoming ActivityStreams type conversion.
func IsMalformed(err error) bool {
	_, ok := errors.Value(err, malformedKey).(struct{})
	return ok
}

// SetMalformed will wrap the given error to store a "malformed" flag,
// returning wrapped error. See IsMalformed() for example use-cases.
func SetMalformed(err error) error {
	return errors.WithValue(err, malformedKey, struct{}{})
}

// IsNotRelevant checks error for a stored "notRelevant" flag.
// This error is used when determining whether or not to store
// + process an incoming AP message.
func IsNotRelevant(err error) bool {
	_, ok := errors.Value(err, notRelevantKey).(struct{})
	return ok
}

// SetNotRelevant will wrap the given error to store a "notRelevant" flag,
// returning wrapped error. See IsNotRelevant() for example use-cases.
func SetNotRelevant(err error) error {
	return errors.WithValue(err, notRelevantKey, struct{}{})
}

// IsSpam checks error for a stored "spam" flag. This error is used when
// determining whether or not to store + process an incoming AP message.
func IsSpam(err error) bool {
	_, ok := errors.Value(err, spamKey).(struct{})
	return ok
}

// SetSpam will wrap the given error to store a "spam" flag,
// returning wrapped error. See IsSpam() for example use-cases.
func SetSpam(err error) error {
	return errors.WithValue(err, spamKey, struct{}{})
}