field.go 1.5 KB

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