Files
postmoogle/vendor/go.mau.fi/util/dbutil/reflectscan.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)
}