schema/field: store reflect type info in json fields

This commit is contained in:
Ariel Mashraki
2021-05-31 09:51:15 +03:00
committed by Ariel Mashraki
parent 5eb5f501f0
commit 46cf7ad36a
3 changed files with 26 additions and 12 deletions

View File

@@ -9,4 +9,4 @@
// Package internal holds a loadable version of the latest schema.
package internal
const Schema = `{"Schema":"entgo.io/ent/examples/privacytenant/ent/schema","Package":"entgo.io/ent/examples/privacytenant/ent","Schemas":[{"name":"Group","config":{"Table":""},"edges":[{"name":"tenant","type":"Tenant","unique":true,"required":true},{"name":"users","type":"User","ref_name":"groups","inverse":true}],"fields":[{"name":"name","type":{"Type":7,"Ident":"","PkgPath":"","Nillable":false,"RType":null},"default":true,"default_value":"Unknown","default_kind":24,"position":{"Index":0,"MixedIn":false,"MixinIndex":0}}],"policy":[{"Index":0,"MixedIn":true,"MixinIndex":0},{"Index":0,"MixedIn":true,"MixinIndex":1},{"Index":0,"MixedIn":false,"MixinIndex":0}]},{"name":"Tenant","config":{"Table":""},"fields":[{"name":"name","type":{"Type":7,"Ident":"","PkgPath":"","Nillable":false,"RType":null},"validators":1,"position":{"Index":0,"MixedIn":false,"MixinIndex":0}}],"policy":[{"Index":0,"MixedIn":true,"MixinIndex":0},{"Index":0,"MixedIn":false,"MixinIndex":0}]},{"name":"User","config":{"Table":""},"edges":[{"name":"tenant","type":"Tenant","unique":true,"required":true},{"name":"groups","type":"Group"}],"fields":[{"name":"name","type":{"Type":7,"Ident":"","PkgPath":"","Nillable":false,"RType":null},"default":true,"default_value":"Unknown","default_kind":24,"position":{"Index":0,"MixedIn":false,"MixinIndex":0}},{"name":"foods","type":{"Type":3,"Ident":"[]string","PkgPath":"","Nillable":true,"RType":null},"optional":true,"position":{"Index":1,"MixedIn":false,"MixinIndex":0}}],"policy":[{"Index":0,"MixedIn":true,"MixinIndex":0},{"Index":0,"MixedIn":true,"MixinIndex":1}]}],"Features":["privacy","entql","schema/snapshot"]}`
const Schema = `{"Schema":"entgo.io/ent/examples/privacytenant/ent/schema","Package":"entgo.io/ent/examples/privacytenant/ent","Schemas":[{"name":"Group","config":{"Table":""},"edges":[{"name":"tenant","type":"Tenant","unique":true,"required":true},{"name":"users","type":"User","ref_name":"groups","inverse":true}],"fields":[{"name":"name","type":{"Type":7,"Ident":"","PkgPath":"","Nillable":false,"RType":null},"default":true,"default_value":"Unknown","default_kind":24,"position":{"Index":0,"MixedIn":false,"MixinIndex":0}}],"policy":[{"Index":0,"MixedIn":true,"MixinIndex":0},{"Index":0,"MixedIn":true,"MixinIndex":1},{"Index":0,"MixedIn":false,"MixinIndex":0}]},{"name":"Tenant","config":{"Table":""},"fields":[{"name":"name","type":{"Type":7,"Ident":"","PkgPath":"","Nillable":false,"RType":null},"validators":1,"position":{"Index":0,"MixedIn":false,"MixinIndex":0}}],"policy":[{"Index":0,"MixedIn":true,"MixinIndex":0},{"Index":0,"MixedIn":false,"MixinIndex":0}]},{"name":"User","config":{"Table":""},"edges":[{"name":"tenant","type":"Tenant","unique":true,"required":true},{"name":"groups","type":"Group"}],"fields":[{"name":"name","type":{"Type":7,"Ident":"","PkgPath":"","Nillable":false,"RType":null},"default":true,"default_value":"Unknown","default_kind":24,"position":{"Index":0,"MixedIn":false,"MixinIndex":0}},{"name":"foods","type":{"Type":3,"Ident":"[]string","PkgPath":"","Nillable":true,"RType":{"Name":"","Ident":"[]string","Kind":23,"PkgPath":"","Methods":{}}},"optional":true,"position":{"Index":1,"MixedIn":false,"MixinIndex":0}}],"policy":[{"Index":0,"MixedIn":true,"MixinIndex":0},{"Index":0,"MixedIn":true,"MixinIndex":1}]}],"Features":["privacy","entql","schema/snapshot"]}`

View File

@@ -72,20 +72,21 @@ func Time(name string) *timeBuilder {
//
func JSON(name string, typ interface{}) *jsonBuilder {
t := reflect.TypeOf(typ)
info := &TypeInfo{
Type: TypeJSON,
Ident: t.String(),
PkgPath: t.PkgPath(),
}
b := &jsonBuilder{&Descriptor{
Name: name,
Info: &TypeInfo{
Type: TypeJSON,
Ident: t.String(),
PkgPath: t.PkgPath(),
},
}}
b.desc.goType(typ, t)
switch t.Kind() {
case reflect.Slice, reflect.Array, reflect.Ptr, reflect.Map:
info.Nillable = true
info.PkgPath = pkgPath(t)
b.desc.Info.Nillable = true
b.desc.Info.PkgPath = pkgPath(t)
}
return &jsonBuilder{&Descriptor{
Name: name,
Info: info,
}}
return b
}
// Strings returns a new JSON Field with type []string.

View File

@@ -427,6 +427,18 @@ func TestJSON(t *testing.T) {
assert.Equal(t, field.TypeJSON, fd.Info.Type)
assert.Equal(t, "map[string]string", fd.Info.String())
assert.Equal(t, "comment", fd.Comment)
assert.True(t, fd.Info.Nillable)
assert.False(t, fd.Info.RType.IsPtr())
type T struct{ S string }
fd = field.JSON("name", &T{}).
Descriptor()
assert.True(t, fd.Info.Nillable)
assert.Equal(t, "*field_test.T", fd.Info.Ident)
assert.Equal(t, "entgo.io/ent/schema/field_test", fd.Info.PkgPath)
assert.True(t, fd.Info.RType.IsPtr())
assert.Equal(t, "T", fd.Info.RType.Name)
assert.Equal(t, "entgo.io/ent/schema/field_test", fd.Info.RType.PkgPath)
fd = field.JSON("dir", http.Dir("dir")).
Optional().
@@ -436,6 +448,7 @@ func TestJSON(t *testing.T) {
assert.Equal(t, "dir", fd.Name)
assert.Equal(t, "net/http", fd.Info.PkgPath)
assert.Equal(t, "http.Dir", fd.Info.String())
assert.False(t, fd.Info.Nillable)
fd = field.Strings("strings").
Optional().