From 0bb1cd5e2ea4021a2e5080265f0a11e3924a74d0 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Wed, 20 Dec 2023 16:10:32 +0000 Subject: [PATCH] Rework error messages, see #45. --- ext/array/array.go | 14 +++++++------- internal/util/reflect.go | 10 ++++++++++ internal/util/reflect_test.go | 21 +++++++++++++++++++++ 3 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 internal/util/reflect.go create mode 100644 internal/util/reflect_test.go diff --git a/ext/array/array.go b/ext/array/array.go index f10c508..921aa1b 100644 --- a/ext/array/array.go +++ b/ext/array/array.go @@ -8,6 +8,7 @@ import ( "reflect" "github.com/ncruces/go-sqlite3" + "github.com/ncruces/go-sqlite3/internal/util" ) // Register registers the array single-argument, table-valued SQL function. @@ -102,7 +103,7 @@ func (c *cursor) Column(ctx *sqlite3.Context, n int) error { ctx.ResultBlob(v.Bytes()) default: - return fmt.Errorf("array: unsupported element:%.0w %v", sqlite3.MISMATCH, v.Type()) + return fmt.Errorf("array: unsupported element:%.0w %v", sqlite3.MISMATCH, util.ReflectType(v)) } return nil } @@ -120,16 +121,15 @@ func (c *cursor) Filter(idxNum int, idxStr string, arg ...sqlite3.Value) error { } func indexable(v reflect.Value) (reflect.Value, error) { - if v.Kind() == reflect.Slice { + switch v.Kind() { + case reflect.Slice: return v, nil - } - if v.Kind() == reflect.Array { + case reflect.Array: return v, nil - } - if v.Kind() == reflect.Pointer { + case reflect.Pointer: if v := v.Elem(); v.Kind() == reflect.Array { return v, nil } } - return v, fmt.Errorf("array: unsupported argument:%.0w %v", sqlite3.MISMATCH, v) + return v, fmt.Errorf("array: unsupported argument:%.0w %v", sqlite3.MISMATCH, util.ReflectType(v)) } diff --git a/internal/util/reflect.go b/internal/util/reflect.go new file mode 100644 index 0000000..3104a7c --- /dev/null +++ b/internal/util/reflect.go @@ -0,0 +1,10 @@ +package util + +import "reflect" + +func ReflectType(v reflect.Value) reflect.Type { + if v.Kind() != reflect.Invalid { + return v.Type() + } + return nil +} diff --git a/internal/util/reflect_test.go b/internal/util/reflect_test.go new file mode 100644 index 0000000..72a19a8 --- /dev/null +++ b/internal/util/reflect_test.go @@ -0,0 +1,21 @@ +package util + +import ( + "fmt" + "math" + "reflect" + "testing" +) + +func TestReflectType(t *testing.T) { + tests := []any{nil, 1, math.Pi, "abc"} + for _, tt := range tests { + t.Run(fmt.Sprint(tt), func(t *testing.T) { + want := fmt.Sprintf("%T", tt) + got := fmt.Sprintf("%v", ReflectType(reflect.ValueOf(tt))) + if got != want { + t.Errorf("ReflectType() = %v, want %v", got, want) + } + }) + } +}