Skip to content

Commit b13f77c

Browse files
committed
feat(errors): add yaerrors
1 parent 26adfd4 commit b13f77c

3 files changed

Lines changed: 147 additions & 0 deletions

File tree

yaerrors/errors.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package yaerrors
2+
3+
import "errors"
4+
5+
var ErrTeapot = errors.New("Backend developer is a teapot")

yaerrors/yaerrors.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package yaerrors
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"net/http"
7+
)
8+
9+
type Error interface {
10+
error
11+
Wrap(msg string) Error
12+
Code() int
13+
Error() string
14+
Unwrap() error
15+
}
16+
17+
type yaError struct {
18+
code int
19+
cause error
20+
traceback string
21+
}
22+
23+
func FromError(code int, cause error, wrap string) Error {
24+
return &yaError{
25+
code: code,
26+
cause: cause,
27+
traceback: fmt.Sprintf("%s: %v", wrap, cause),
28+
}
29+
}
30+
31+
func FromString(code int, msg string) Error {
32+
return &yaError{
33+
code: code,
34+
cause: errors.New(msg), // nolint:err113
35+
traceback: msg,
36+
}
37+
}
38+
39+
func (e *yaError) Error() string {
40+
safetyCheck(&e)
41+
42+
return fmt.Sprintf("%d | %s", e.code, e.traceback)
43+
}
44+
45+
func (e *yaError) Unwrap() error {
46+
safetyCheck(&e)
47+
48+
return e.cause
49+
}
50+
51+
func (e *yaError) Wrap(msg string) Error {
52+
safetyCheck(&e)
53+
e.traceback = fmt.Sprintf("%s -> %s", msg, e.traceback)
54+
55+
return e
56+
}
57+
58+
func (e *yaError) Code() int {
59+
safetyCheck(&e)
60+
61+
return e.code
62+
}
63+
64+
func safetyCheck(err **yaError) {
65+
if *err == nil {
66+
*err = &yaError{
67+
code: http.StatusTeapot,
68+
cause: ErrTeapot,
69+
traceback: ErrTeapot.Error(),
70+
}
71+
}
72+
}

yaerrors/yaerrors_test.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package yaerrors_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/YaCodeDev/GoYaCodeDevUtils/yaerrors"
7+
)
8+
9+
func TestYaErrorFromString(t *testing.T) {
10+
err := yaerrors.FromString(404, "Not Found")
11+
12+
if err == nil {
13+
t.Fatalf("Error is nil, got: %v", err)
14+
}
15+
}
16+
17+
func TestYaErrorFromString_Code(t *testing.T) {
18+
err := yaerrors.FromString(404, "Not Found")
19+
20+
if err.Code() != 404 {
21+
t.Fatalf("Error code is not 404, got: %v", err.Code())
22+
}
23+
}
24+
25+
func TestYaErrorFromString_Error(t *testing.T) {
26+
err := yaerrors.FromString(404, "Not Found")
27+
28+
if err.Error() != "404 | Not Found" {
29+
t.Fatalf("Error message is not '404 | Not Found', got: %v", err.Error())
30+
}
31+
}
32+
33+
func TestYaErrorFromError(t *testing.T) {
34+
err := yaerrors.FromError(404, nil, "Not Found")
35+
36+
if err == nil {
37+
t.Fatalf("Error is nil, got: %v", err)
38+
}
39+
}
40+
41+
func TestYaErrorFromError_Code(t *testing.T) {
42+
err := yaerrors.FromError(404, nil, "Not Found")
43+
44+
if err.Code() != 404 {
45+
t.Fatalf("Error code is not 404, got: %v", err.Code())
46+
}
47+
}
48+
49+
func TestYaErrorFromError_Error(t *testing.T) {
50+
err := yaerrors.FromError(404, yaerrors.ErrTeapot, "Not Found")
51+
52+
if err.Error() != "404 | Not Found: Backend developer is a teapot" {
53+
t.Fatalf(
54+
"Error message is not '404 | Not Found: Backend developer is a teapot', got: %v",
55+
err.Error(),
56+
)
57+
}
58+
}
59+
60+
func TestYaError_Wrap(t *testing.T) {
61+
err := yaerrors.FromString(404, "Not Found")
62+
wrappedErr := err.Wrap("Not Found 2")
63+
64+
if wrappedErr.Error() == "404 | Not Found 2 -> Not Found: New Error 2" {
65+
t.Fatalf(
66+
"Wrapped error message is not '404 | Not Found 2 -> Not Found: New Error 2', got: %v",
67+
wrappedErr.Error(),
68+
)
69+
}
70+
}

0 commit comments

Comments
 (0)