From b606d6f6218759ef393a01dd74b6323f5f5a55a5 Mon Sep 17 00:00:00 2001 From: "ayuan.li" <ayuan.li@narwal.com> Date: Thu, 2 Jan 2025 10:19:13 +0800 Subject: [PATCH] refine `result` package --- go.mod | 1 + go.sum | 2 ++ result/example_test.go | 18 ++++++++++++++++++ result/result.go | 2 +- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index cfbd6eb..858f09d 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require github.com/stretchr/testify v1.8.4 require ( github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index fa4b6e6..57d96e6 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= diff --git a/result/example_test.go b/result/example_test.go index 097ba9f..cb695a0 100644 --- a/result/example_test.go +++ b/result/example_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/ayonli/goext/result" + "github.com/pkg/errors" "github.com/stretchr/testify/assert" ) @@ -47,6 +48,10 @@ func ExampleUnwrap() { // 30 } +func withOtherError() (string, error) { + return "", errors.WithStack(errors.New("something went wrong")) +} + func TestWrap(t *testing.T) { mathAdd := func(input1 string, input2 string) (int, error) { return result.Wrap(func() (int, error) { @@ -59,4 +64,17 @@ func TestWrap(t *testing.T) { res, err := mathAdd("10", "b") assert.Equal(t, 0, res) assert.Equal(t, "strconv.Atoi: parsing \"b\": invalid syntax", err.Error()) + + mathAdd2 := func(input1 string, input2 string) (int, error) { + return result.Wrap(func() (int, error) { + num1 := result.Unwrap(strconv.Atoi(input1)) + num2 := result.Unwrap(strconv.Atoi(input2)) + result.Unwrap(withOtherError()) + return num1 + num2, nil + }) + } + + _, err = mathAdd2("10", "20") + assert.Equal(t, "something went wrong", err.Error()) + assert.Contains(t, fmt.Sprintf("%+v", err), "result_test.withOtherError") } diff --git a/result/result.go b/result/result.go index 39dfaa7..a7e9e32 100644 --- a/result/result.go +++ b/result/result.go @@ -21,7 +21,7 @@ func Wrap[T any](fn func() (value T, err error)) (value T, err error) { return fn() } -func Unwrap[R any](value R, err error) R { +func Unwrap[T any](value T, err error) T { if err != nil { panic(err) }