From c8a13bbf493b011784d68d948edbe17d3a3fdead Mon Sep 17 00:00:00 2001 From: Samuel Berthe Date: Sun, 3 Jul 2022 20:59:32 +0200 Subject: [PATCH] doc: explain custom panic message for lo.Must helpers --- README.md | 18 ++++++++++++++---- errors.go | 10 +++++++--- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c78ac0f..f838d90 100644 --- a/README.md +++ b/README.md @@ -1574,10 +1574,6 @@ val := lo.Must(time.Parse("2006-01-02", "2022-01-15")) val := lo.Must(time.Parse("2006-01-02", "bad-value")) // panics - -val := lo.Must(lo.Find(myString, func(i string) bool { - return i == requiredChar -}), "'%s' must always contain '%s'", myString, requiredChar) ``` ### Must{0->6} @@ -1612,6 +1608,20 @@ lo.Must0(math.Signbit(v)) before, after := lo.Must2(bytes.Cut(s, sep)) ``` +You can give context to the panic message by adding some printf-like arguments. + +```go +val := lo.Must(lo.Find(myString, func(i string) bool { + return i == requiredChar +}), "'%s' must always contain '%s'", myString, requiredChar) + +// MustX +lo.Must0(example0(), "'%s' must always contain '%s'", myString, requiredChar) +val1 := lo.Must1(example1(), "'%s' must always contain '%s'", myString, requiredChar) +val1, val2 := lo.Must2(example2(), "'%s' must always contain '%s'", myString, requiredChar) +... +``` + ## Try Calls the function and return false in case of error and on panic. diff --git a/errors.go b/errors.go index dfe2795..e9f9c8e 100644 --- a/errors.go +++ b/errors.go @@ -7,7 +7,10 @@ import ( func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { if len(msgAndArgs) == 1 { - return fmt.Sprintf(msgAndArgs[0].(string)) + if msgAsStr, ok := msgAndArgs[0].(string); ok { + return msgAsStr + } + return fmt.Sprintf("%+v", msgAndArgs[0]) } if len(msgAndArgs) > 1 { return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...) @@ -21,18 +24,19 @@ func must(err any, messageArgs ...interface{}) { return } - message := messageFromMsgAndArgs(messageArgs...) - switch e := err.(type) { case bool: if !e { + message := messageFromMsgAndArgs(messageArgs...) if message == "" { message = "not ok" } + panic(message) } case error: + message := messageFromMsgAndArgs(messageArgs...) if message != "" { panic(message + ": " + e.Error()) } else {