(table *schema.Table)
| 87 | type transformer func([][]any) any |
| 88 | |
| 89 | func tableTransformer(table *schema.Table) transformer { |
| 90 | // 1 prep the fields |
| 91 | fields := make([]reflect.StructField, len(table.Columns)) |
| 92 | for i, col := range table.Columns { |
| 93 | fields[i] = reflect.StructField{ |
| 94 | Name: "Fld_" + col.Name, |
| 95 | Type: reflect.PointerTo(columnGoType(col.Type)), // to account for nullability |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | // 2 prep transformer for each field |
| 100 | row := reflect.StructOf(fields) |
| 101 | rowSlice := reflect.SliceOf(row) |
| 102 | |
| 103 | rowTransformer := func(rowData []any) reflect.Value { |
| 104 | v := reflect.New(row).Elem() |
| 105 | for i, elem := range rowData { |
| 106 | val := reflect.ValueOf(elem) |
| 107 | switch { |
| 108 | case elem == nil, val.IsNil(): |
| 109 | default: |
| 110 | v.Field(i).Set(val) |
| 111 | } |
| 112 | } |
| 113 | return v |
| 114 | } |
| 115 | |
| 116 | return func(data [][]any) any { |
| 117 | rows := reflect.MakeSlice(rowSlice, len(data), len(data)) |
| 118 | for i, elem := range data { |
| 119 | rows.Index(i).Set(rowTransformer(elem)) |
| 120 | } |
| 121 | return rows.Interface() |
| 122 | } |
| 123 | } |
no test coverage detected