field.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package gorm
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "reflect"
  7. )
  8. // Field model field definition
  9. type Field struct {
  10. *StructField
  11. IsBlank bool
  12. Field reflect.Value
  13. }
  14. // Set set a value to the field
  15. func (field *Field) Set(value interface{}) (err error) {
  16. if !field.Field.IsValid() {
  17. return errors.New("field value not valid")
  18. }
  19. if !field.Field.CanAddr() {
  20. return ErrUnaddressable
  21. }
  22. reflectValue, ok := value.(reflect.Value)
  23. if !ok {
  24. reflectValue = reflect.ValueOf(value)
  25. }
  26. fieldValue := field.Field
  27. if reflectValue.IsValid() {
  28. if reflectValue.Type().ConvertibleTo(fieldValue.Type()) {
  29. fieldValue.Set(reflectValue.Convert(fieldValue.Type()))
  30. } else {
  31. if fieldValue.Kind() == reflect.Ptr {
  32. if fieldValue.IsNil() {
  33. fieldValue.Set(reflect.New(field.Struct.Type.Elem()))
  34. }
  35. fieldValue = fieldValue.Elem()
  36. }
  37. if reflectValue.Type().ConvertibleTo(fieldValue.Type()) {
  38. fieldValue.Set(reflectValue.Convert(fieldValue.Type()))
  39. } else if scanner, ok := fieldValue.Addr().Interface().(sql.Scanner); ok {
  40. err = scanner.Scan(reflectValue.Interface())
  41. } else {
  42. err = fmt.Errorf("could not convert argument of field %s from %s to %s", field.Name, reflectValue.Type(), fieldValue.Type())
  43. }
  44. }
  45. } else {
  46. field.Field.Set(reflect.Zero(field.Field.Type()))
  47. }
  48. field.IsBlank = isBlank(field.Field)
  49. return err
  50. }