diff options
Diffstat (limited to 'gsql')
| -rw-r--r-- | gsql/gsql.go | 18 | ||||
| -rw-r--r-- | gsql/gsql_test.go | 29 |
2 files changed, 47 insertions, 0 deletions
diff --git a/gsql/gsql.go b/gsql/gsql.go index 7df830c..e7e2aa3 100644 --- a/gsql/gsql.go +++ b/gsql/gsql.go @@ -14,6 +14,9 @@ package gsql import ( "context" "database/sql" + "errors" + + . "go.xyrillian.de/gg/option" ) // ConnectionHandle extends [Handle] with methods that make sense for handles referring to entire connections or connection pools, but not e.g. to transactions. @@ -76,3 +79,18 @@ type Rows interface { Next() bool Scan(slots ...any) error } + +// NoneIfNoRows wraps any call returning a record from a DB that may return [sql.ErrNoRows], +// and converts that error into a [None] in the value position instead. +// +// [None]: https://pkg.go.dev/go.xyrillian.de/gg/option#None +func NoneIfNoRows[T any](value T, err error) (Option[T], error) { + switch { + case err == nil: + return Some(value), nil + case errors.Is(err, sql.ErrNoRows): + return None[T](), nil + default: + return None[T](), err + } +} diff --git a/gsql/gsql_test.go b/gsql/gsql_test.go new file mode 100644 index 0000000..acf0bbf --- /dev/null +++ b/gsql/gsql_test.go @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2026 Stefan Majewsky <majewsky@gmx.net> +// SPDX-License-Identifier: Apache-2.0 + +package gsql_test + +import ( + "database/sql" + "errors" + "testing" + + "go.xyrillian.de/gg/assert" + "go.xyrillian.de/gg/gsql" + . "go.xyrillian.de/gg/option" +) + +func TestNoneIfNoRows(t *testing.T) { + x, err := gsql.NoneIfNoRows(42, nil) + if assert.ErrEqual(t, err, nil) { + assert.Equal(t, x, Some(42)) + } + + x, err = gsql.NoneIfNoRows(0, sql.ErrNoRows) + if assert.ErrEqual(t, err, nil) { + assert.Equal(t, x, None[int]()) + } + + _, err = gsql.NoneIfNoRows(0, errors.New("kaboom")) + assert.ErrEqual(t, err, "kaboom") +} |
