schema/field: support default values for json and other

This commit is contained in:
Ariel Mashraki
2021-10-21 22:39:03 +03:00
committed by Ariel Mashraki
parent 5c76254b5c
commit e687246f7a
32 changed files with 725 additions and 90 deletions

View File

@@ -732,6 +732,28 @@ func (b *jsonBuilder) Annotations(annotations ...schema.Annotation) *jsonBuilder
return b
}
// Default sets the default value of the field. For example:
//
// field.JSON("dirs", []http.Dir{}).
// // A static default value.
// Default([]http.Dir{"/tmp"})
//
// field.JSON("dirs", []http.Dir{}).
// // A function for generating the default value.
// Default(DefaultDirs)
//
func (b *jsonBuilder) Default(v interface{}) *jsonBuilder {
b.desc.Default = v
switch fieldT, defaultT := b.desc.Info.RType.rtype, reflect.TypeOf(v); {
case fieldT == defaultT:
case defaultT.Kind() == reflect.Func:
b.desc.checkDefaultFunc(b.desc.Info.RType.rtype)
default:
b.desc.Err = fmt.Errorf("expect type (func() %[1]s) or (%[1]s) for other default value", b.desc.Info)
}
return b
}
// Descriptor implements the ent.Field interface by returning its descriptor.
func (b *jsonBuilder) Descriptor() *Descriptor {
return b.desc

View File

@@ -467,13 +467,31 @@ func TestJSON(t *testing.T) {
fd = field.Strings("strings").
Optional().
Default([]string{"a", "b"}).
Descriptor()
assert.NoError(t, fd.Err)
assert.True(t, fd.Optional)
assert.Empty(t, fd.Info.PkgPath)
assert.Equal(t, "strings", fd.Name)
assert.Equal(t, []string{"a", "b"}, fd.Default)
assert.Equal(t, field.TypeJSON, fd.Info.Type)
assert.Equal(t, "[]string", fd.Info.String())
fd = field.JSON("dirs", []http.Dir{}).
Default([]http.Dir{"a", "b"}).
Descriptor()
assert.NoError(t, fd.Err)
fd = field.JSON("dirs", []http.Dir{}).
Default(func() []http.Dir {
return []http.Dir{"/tmp"}
}).
Descriptor()
assert.NoError(t, fd.Err)
fd = field.JSON("dirs", []http.Dir{}).
Default([]string{"a", "b"}).
Descriptor()
assert.Error(t, fd.Err)
fd = field.JSON("values", &url.Values{}).Descriptor()
assert.Equal(t, "net/url", fd.Info.PkgPath)
fd = field.JSON("values", []url.Values{}).Descriptor()