Set value for field
This commit is contained in:
parent
58a22df1bb
commit
6c8ab4dd0d
@ -5,4 +5,6 @@ import "errors"
|
|||||||
var (
|
var (
|
||||||
// ErrInvalidTable invalid table name
|
// ErrInvalidTable invalid table name
|
||||||
ErrInvalidTable = errors.New("invalid table name")
|
ErrInvalidTable = errors.New("invalid table name")
|
||||||
|
// ErrUnaddressable unaddressable value
|
||||||
|
ErrUnaddressable = errors.New("using unaddressable value")
|
||||||
)
|
)
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
@ -55,6 +58,49 @@ func GetAssignments(tx *gorm.DB) chan [][]*Field {
|
|||||||
return fieldChan
|
return fieldChan
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set set a value to the field
|
||||||
|
func (field *Field) Set(value interface{}) (err error) {
|
||||||
|
if !field.Value.IsValid() {
|
||||||
|
return errors.New("field value not valid")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !field.Value.CanAddr() {
|
||||||
|
return ErrUnaddressable
|
||||||
|
}
|
||||||
|
|
||||||
|
reflectValue, ok := value.(reflect.Value)
|
||||||
|
if !ok {
|
||||||
|
reflectValue = reflect.ValueOf(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldValue := field.Value
|
||||||
|
if reflectValue.IsValid() {
|
||||||
|
if reflectValue.Type().ConvertibleTo(fieldValue.Type()) {
|
||||||
|
fieldValue.Set(reflectValue.Convert(fieldValue.Type()))
|
||||||
|
} else {
|
||||||
|
if fieldValue.Kind() == reflect.Ptr {
|
||||||
|
if fieldValue.IsNil() {
|
||||||
|
fieldValue.Set(reflect.New(field.StructField.Type.Elem()))
|
||||||
|
}
|
||||||
|
fieldValue = fieldValue.Elem()
|
||||||
|
}
|
||||||
|
|
||||||
|
if reflectValue.Type().ConvertibleTo(fieldValue.Type()) {
|
||||||
|
fieldValue.Set(reflectValue.Convert(fieldValue.Type()))
|
||||||
|
} else if scanner, ok := fieldValue.Addr().Interface().(sql.Scanner); ok {
|
||||||
|
err = scanner.Scan(reflectValue.Interface())
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("could not convert argument of field %s from %s to %s", field.Name, reflectValue.Type(), fieldValue.Type())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
field.Value.Set(reflect.Zero(fieldValue.Type()))
|
||||||
|
}
|
||||||
|
|
||||||
|
field.IsBlank = isBlank(field.Value)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func mapToFields(value map[string]interface{}, stmt *builder.Statement, s *schema.Schema) (fields []*Field) {
|
func mapToFields(value map[string]interface{}, stmt *builder.Statement, s *schema.Schema) (fields []*Field) {
|
||||||
// sort
|
// sort
|
||||||
// TODO assign those value to dest
|
// TODO assign those value to dest
|
||||||
|
Loading…
x
Reference in New Issue
Block a user