11 // Field model field definition
18 // Set set a value to the field
19 func (field *Field) Set(value interface{}) (err error) {
20 if !field.Field.IsValid() {
21 return errors.New("field value not valid")
24 if !field.Field.CanAddr() {
25 return ErrUnaddressable
28 reflectValue, ok := value.(reflect.Value)
30 reflectValue = reflect.ValueOf(value)
33 fieldValue := field.Field
34 if reflectValue.IsValid() {
35 if reflectValue.Type().ConvertibleTo(fieldValue.Type()) {
36 fieldValue.Set(reflectValue.Convert(fieldValue.Type()))
38 if fieldValue.Kind() == reflect.Ptr {
39 if fieldValue.IsNil() {
40 fieldValue.Set(reflect.New(field.Struct.Type.Elem()))
42 fieldValue = fieldValue.Elem()
45 if reflectValue.Type().ConvertibleTo(fieldValue.Type()) {
46 fieldValue.Set(reflectValue.Convert(fieldValue.Type()))
47 } else if scanner, ok := fieldValue.Addr().Interface().(sql.Scanner); ok {
48 v := reflectValue.Interface()
49 if valuer, ok := v.(driver.Valuer); ok {
50 if v, err = valuer.Value(); err == nil {
57 err = fmt.Errorf("could not convert argument of field %s from %s to %s", field.Name, reflectValue.Type(), fieldValue.Type())
61 field.Field.Set(reflect.Zero(field.Field.Type()))
64 field.IsBlank = isBlank(field.Field)