31 lines
979 B
Go
31 lines
979 B
Go
// Copyright (c) 2024 Tulir Asokan
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package dbutil
|
|
|
|
import (
|
|
"reflect"
|
|
)
|
|
|
|
func reflectScan[T any](row Scannable) (*T, error) {
|
|
t := new(T)
|
|
val := reflect.ValueOf(t).Elem()
|
|
fields := reflect.VisibleFields(val.Type())
|
|
scanInto := make([]any, len(fields))
|
|
for i, field := range fields {
|
|
scanInto[i] = val.FieldByIndex(field.Index).Addr().Interface()
|
|
}
|
|
err := row.Scan(scanInto...)
|
|
return t, err
|
|
}
|
|
|
|
// NewSimpleReflectRowIter creates a new RowIter that uses reflection to scan rows into the given type.
|
|
//
|
|
// This is a simplified implementation that always scans to all struct fields. It does not support any kind of struct tags.
|
|
func NewSimpleReflectRowIter[T any](rows Rows, err error) RowIter[*T] {
|
|
return ConvertRowFn[*T](reflectScan[T]).NewRowIter(rows, err)
|
|
}
|