From a81b61ecf247734bb9280b320eb882feb84d6335 Mon Sep 17 00:00:00 2001 From: A-yon Lee Date: Thu, 2 Jan 2025 02:55:19 +0800 Subject: [PATCH] add `result` package --- result/example_test.go | 46 ++++++++++++++++++++++++++++++++++++++++++ result/result.go | 30 +++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 result/example_test.go create mode 100644 result/result.go diff --git a/result/example_test.go b/result/example_test.go new file mode 100644 index 0000000..3865996 --- /dev/null +++ b/result/example_test.go @@ -0,0 +1,46 @@ +package result_test + +import ( + "fmt" + "strconv" + + "github.com/ayonli/goext/result" +) + +func ExampleWrap() { + mathAdd := 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)) + return num1 + num2, nil + }) + } + + res, err := mathAdd("10", "20") + if err != nil { + fmt.Println(err) + } else { + fmt.Println(res) + } + // Output: + // 30 +} + +func ExampleUnwrap() { + mathAdd := 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)) + return num1 + num2, nil + }) + } + + res, err := mathAdd("10", "20") + if err != nil { + fmt.Println(err) + } else { + fmt.Println(res) + } + // Output: + // 30 +} diff --git a/result/result.go b/result/result.go new file mode 100644 index 0000000..f37d1c5 --- /dev/null +++ b/result/result.go @@ -0,0 +1,30 @@ +package result + +import ( + "errors" + "fmt" +) + +func Wrap[R any](fn func() (value R, err error)) (value R, err error) { + defer func() { + if re := recover(); re != nil { + if _err, ok := re.(error); ok { + err = _err + } else if str, ok := re.(string); ok { + err = errors.New(str) + } else { + err = errors.New(fmt.Sprint(re)) + } + } + }() + + return fn() +} + +func Unwrap[R any](value R, err error) R { + if err != nil { + panic(err) + } + + return value +}