summaryrefslogtreecommitdiffstats
path: root/sqlr.go
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2024-02-06 22:32:09 -0800
committerRose Hogenson <rosehogenson@posteo.net>2024-02-06 22:32:09 -0800
commitbe2efe80d7f11b695cb542ae94b4d5f1f69ba537 (patch)
tree6564d8521faee4144c5bd3954ef65a194ce8323c /sqlr.go
parent432e3bda53ca02b9f3eb58163f8459d051f1df20 (diff)
downloadsqlr-be2efe80d7f11b695cb542ae94b4d5f1f69ba537.tar.zst
Use reflect.VisibleFields to find struct fields.
Diffstat (limited to 'sqlr.go')
-rw-r--r--sqlr.go37
1 files changed, 15 insertions, 22 deletions
diff --git a/sqlr.go b/sqlr.go
index 0224c7c..4ac798f 100644
--- a/sqlr.go
+++ b/sqlr.go
@@ -15,36 +15,29 @@ func Scan(rows *sql.Rows, v any) error {
return fmt.Errorf("Scan needs a pointer to a struct")
}
inner := rv.Elem()
- innerType := inner.Type()
-
- fields := make(map[string]reflect.StructField)
- inner.FieldByNameFunc(func(fieldName string) bool {
- field, ok := innerType.FieldByName(fieldName)
- if !ok {
- return false
- }
- tag, ok := field.Tag.Lookup("sql")
- if !ok {
- fields[fieldName] = field
- return false
- }
- if tag != "-" {
- fields[tag] = field
- }
- return false
- })
+ fields := reflect.VisibleFields(inner.Type())
cols, err := rows.Columns()
if err != nil {
return err
}
dest := make([]any, len(cols))
+Cols:
for i, c := range cols {
- field, ok := fields[c]
- if !ok {
- return fmt.Errorf("no field with tag %q", c)
+ for _, f := range fields {
+ if !f.IsExported() {
+ continue
+ }
+ tag := f.Tag.Get("sql")
+ if tag == "" {
+ tag = f.Name
+ }
+ if tag == c {
+ dest[i] = inner.FieldByIndex(f.Index).Addr().Interface()
+ continue Cols
+ }
}
- dest[i] = inner.FieldByIndex(field.Index).Addr().Interface()
+ return fmt.Errorf("no field with tag %q", c)
}
return rows.Scan(dest...)