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 }