wrappederror/pkg.go
2023-09-26 08:49:08 +02:00

74 lines
1.0 KiB
Go

package WrappedError
import (
// Standard
"errors"
"fmt"
"path"
"runtime"
)
type Error struct {
err error
file string
line int
}
type LogCallback func(Error)
var (
logCallback LogCallback
baseDirLength int
)
func init() {
_, file, _, _ := runtime.Caller(1)
fmt.Printf("--\nWRAPPED_ERROR: %s\n--\n", file)
dir := path.Dir(file)
dirBase := path.Dir(dir)
baseDirLength = len(dirBase)
}
func SetLogCallback(cbk LogCallback) {
logCallback = cbk
}
func callback(wrapped Error) {
if logCallback != nil {
logCallback(wrapped)
}
}
func (wrapped Error) Error() string {
return fmt.Sprintf(
"[%s:%d] %s",
wrapped.file,
wrapped.line,
wrapped.err.Error(),
)
}
func create(err error) error {
_, file, line, _ := runtime.Caller(2)
file = file[baseDirLength+1:]
wrapped := Error{
err: err,
file: file,
line: line,
}
callback(wrapped)
return wrapped
}
func Wrap(err error) error {
return create(err)
}
func New(msg string) error {
wrapped := create(errors.New(msg))
return wrapped
}