diff options
Diffstat (limited to 'sqlr.go')
| -rw-r--r-- | sqlr.go | 37 |
1 files changed, 15 insertions, 22 deletions
@@ -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...) |
