summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gobang.go19
-rw-r--r--tests/gobang.go29
2 files changed, 48 insertions, 0 deletions
diff --git a/src/gobang.go b/src/gobang.go
index dd638f2..a35a57e 100644
--- a/src/gobang.go
+++ b/src/gobang.go
@@ -71,6 +71,25 @@ func ValidateSQLTablePrefix(prefix string) error {
return nil
}
+func WrapErrors(errs ...error) error {
+ slices.Reverse(errs)
+ var out error
+ for _, err := range errs {
+ if err != nil {
+ if out == nil {
+ out = err
+ } else {
+ out = fmt.Errorf(
+ "error %w on top of %w",
+ err,
+ out,
+ )
+ }
+ }
+ }
+ return out
+}
+
func SomeError(errs ...error) error {
for _, err := range errs {
if err != nil {
diff --git a/tests/gobang.go b/tests/gobang.go
index be33eb4..9d42ca9 100644
--- a/tests/gobang.go
+++ b/tests/gobang.go
@@ -3,6 +3,7 @@ package gobang
import (
"encoding/json"
"errors"
+ "fmt"
"log/slog"
"os"
"strings"
@@ -48,6 +49,32 @@ func test_ValidateSQLTablePrefix() {
})
}
+func test_WrapErrors() {
+ TestStart("WrapErrors()")
+
+ Testing("nil for empty args", func() {
+ TAssertEqual(WrapErrors(), nil)
+ })
+
+ Testing("nil when all args are nil", func() {
+ TAssertEqual(WrapErrors(nil, nil, nil), nil)
+ })
+
+ Testing("if only 1 is an error, return it", func() {
+ err := errors.New("my error")
+ TAssertEqual(WrapErrors(nil, nil, err), err)
+ })
+
+ Testing("otherwise wrap them, from right to left", func() {
+ err1 := errors.New("error 1")
+ err2 := errors.New("error 2")
+ expected1 := fmt.Errorf("error %w on top of %w", err1, err2)
+ expected2 := fmt.Errorf("error %w on top of %w", err2, err1)
+ TAssertEqual(WrapErrors(nil, err1, nil, err2), expected1)
+ TAssertEqual(WrapErrors(err2, nil, nil, err1), expected2)
+ })
+}
+
func test_SomeError() {
TestStart("SomeError()")
@@ -763,8 +790,10 @@ func test_setHostname() {
}
+
func MainTest() {
test_ValidateSQLTablePrefix()
+ test_WrapErrors()
test_SomeError()
test_SomeFnError()
test_Random()