refactor: update interface contract and applies some fixes
This commit is contained in:
55
internal/repository/scanner_helper.go
Normal file
55
internal/repository/scanner_helper.go
Normal file
@@ -0,0 +1,55 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
func scanRow(row *sql.Row, dest any) error {
|
||||
destValue := reflect.ValueOf(dest).Elem()
|
||||
fields := make([]any, destValue.NumField())
|
||||
|
||||
for i := 0; i < destValue.NumField(); i++ {
|
||||
fields[i] = destValue.Field(i).Addr().Interface()
|
||||
}
|
||||
|
||||
return row.Scan(fields...)
|
||||
}
|
||||
|
||||
func ScanRows(rows *sql.Rows, destSlice any) error {
|
||||
sliceValue := reflect.ValueOf(destSlice)
|
||||
if sliceValue.Kind() != reflect.Pointer || sliceValue.Elem().Kind() != reflect.Slice {
|
||||
return fmt.Errorf("destSlice must be a pointer to a slice")
|
||||
}
|
||||
|
||||
sliceElem := sliceValue.Elem()
|
||||
structType := sliceElem.Type().Elem()
|
||||
|
||||
for rows.Next() {
|
||||
newStruct := reflect.New(structType).Elem()
|
||||
|
||||
fields := make([]any, newStruct.NumField())
|
||||
for i := 0; i < newStruct.NumField(); i++ {
|
||||
fields[i] = newStruct.Field(i).Addr().Interface()
|
||||
}
|
||||
|
||||
if err := rows.Scan(fields...); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
sliceElem.Set(reflect.Append(sliceElem, newStruct))
|
||||
}
|
||||
|
||||
return rows.Err()
|
||||
}
|
||||
|
||||
func GetStructFieldsPtr(object any) []any {
|
||||
destValue := reflect.ValueOf(object).Elem()
|
||||
fields := make([]any, destValue.NumField())
|
||||
|
||||
for i := 0; i < destValue.NumField(); i++ {
|
||||
fields[i] = destValue.Field(i).Addr().Interface()
|
||||
}
|
||||
return fields
|
||||
}
|
||||
Reference in New Issue
Block a user