sql struct scanner with reflection and iterators
scanner.go edited
35 lines 630 B view raw
1type Scanner[T any] struct { 2 rows *sql.Rows 3} 4 5func NewScanner[T any](rows *sql.Rows) Scanner[T] { 6 return Scanner[T]{ 7 rows: rows, 8 } 9} 10 11func (s *Scanner[T]) Scan() iter.Seq2[T, error] { 12 return func(yield func(T, error) bool) { 13 for s.rows.Next() { 14 var data T 15 elem := reflect.ValueOf(&data).Elem() 16 numCols := elem.NumField() 17 columns := make([]any, numCols) 18 19 for i := range numCols { 20 field := elem.Field(i) 21 columns[i] = field.Addr().Interface() 22 } 23 24 err := s.rows.Scan(columns...) 25 26 if !yield(data, err) { 27 return 28 } 29 } 30 } 31} 32 33func (s *Scanner[T]) Close() error { 34 return s.rows.Close() 35}