type Scanner[T any] struct { rows *sql.Rows } func NewScanner[T any](rows *sql.Rows) Scanner[T] { return Scanner[T]{ rows: rows, } } func (s *Scanner[T]) Scan() iter.Seq2[T, error] { return func(yield func(T, error) bool) { for s.rows.Next() { var data T elem := reflect.ValueOf(&data).Elem() numCols := elem.NumField() columns := make([]any, numCols) for i := range numCols { field := elem.Field(i) columns[i] = field.Addr().Interface() } err := s.rows.Scan(columns...) if !yield(data, err) { return } } } } func (s *Scanner[T]) Close() error { return s.rows.Close() }