summaryrefslogtreecommitdiff
path: root/internal/gtserror/new_caller.go
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2023-05-28 13:08:35 +0100
committerLibravatar GitHub <noreply@github.com>2023-05-28 14:08:35 +0200
commit5faeb4de2032e112ab49751eeeb906ac43826f3d (patch)
treeea94b86f27384954ff93aec864b13b83c7f46db0 /internal/gtserror/new_caller.go
parent[docs] Update + simplify roadmap, revise beta estimate (#1826) (diff)
downloadgotosocial-5faeb4de2032e112ab49751eeeb906ac43826f3d.tar.xz
[chore] tidy up media manager, add calling func to errors, build-script improvements (#1835)
* media manager tidy-up: de-interface and remove unused PostDataFunc Signed-off-by: kim <grufwub@gmail.com> * remove last traces of media.Manager being an interface Signed-off-by: kim <grufwub@gmail.com> * update error to provide caller, allow tuneable via build tags Signed-off-by: kim <grufwub@gmail.com> * remove kim-specific build script changes Signed-off-by: kim <grufwub@gmail.com> * fix merge conflicts Signed-off-by: kim <grufwub@gmail.com> * update build-script to support externally setting build variables Signed-off-by: kim <grufwub@gmail.com> --------- Signed-off-by: kim <grufwub@gmail.com>
Diffstat (limited to 'internal/gtserror/new_caller.go')
-rw-r--r--internal/gtserror/new_caller.go92
1 files changed, 92 insertions, 0 deletions
diff --git a/internal/gtserror/new_caller.go b/internal/gtserror/new_caller.go
new file mode 100644
index 000000000..46ae76d6a
--- /dev/null
+++ b/internal/gtserror/new_caller.go
@@ -0,0 +1,92 @@
+// 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/>.
+
+//go:build !noerrcaller
+
+package gtserror
+
+import (
+ "errors"
+ "fmt"
+ "runtime"
+ "strings"
+)
+
+// Caller returns whether created errors will prepend calling function name.
+const Caller = true
+
+// cerror wraps an error with a string
+// prefix of the caller function name.
+type cerror struct {
+ c string
+ e error
+}
+
+func (ce *cerror) Error() string {
+ msg := ce.e.Error()
+ return ce.c + ": " + msg
+}
+
+func (ce *cerror) Unwrap() error {
+ return ce.e
+}
+
+// newAt is the same as New() but allows specifying calldepth.
+func newAt(calldepth int, msg string) error {
+ return &cerror{
+ c: caller(calldepth + 1),
+ e: errors.New(msg),
+ }
+}
+
+// newfAt is the same as Newf() but allows specifying calldepth.
+func newfAt(calldepth int, msgf string, args ...any) error {
+ return &cerror{
+ c: caller(calldepth + 1),
+ e: fmt.Errorf(msgf, args...),
+ }
+}
+
+// caller fetches the calling function name, skipping 'depth'. Results are cached per PC.
+func caller(depth int) string {
+ var pcs [1]uintptr
+
+ // Fetch calling function using calldepth
+ _ = runtime.Callers(depth, pcs[:])
+ fn := runtime.FuncForPC(pcs[0])
+
+ if fn == nil {
+ return ""
+ }
+
+ // Get func name.
+ name := fn.Name()
+
+ // Drop everything but but function name itself
+ if idx := strings.LastIndexByte(name, '.'); idx >= 0 {
+ name = name[idx+1:]
+ }
+
+ const params = `[...]`
+
+ // Drop any generic type parameter markers
+ if idx := strings.Index(name, params); idx >= 0 {
+ name = name[:idx] + name[idx+len(params):]
+ }
+
+ return name
+}