refactor: update interface contract and applies some fixes

This commit is contained in:
2025-11-02 17:51:55 -03:00
parent af511203a4
commit 4a28259dc8
4 changed files with 121 additions and 44 deletions

View 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
}