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)
 	}