scanner.go
edited
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}