mirror of
https://github.com/ent/ent.git
synced 2026-04-28 05:30:56 +03:00
schema/field: store reflect type info in json fields
This commit is contained in:
committed by
Ariel Mashraki
parent
5eb5f501f0
commit
46cf7ad36a
@@ -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"]}`
|
||||
|
||||
@@ -72,20 +72,21 @@ func Time(name string) *timeBuilder {
|
||||
//
|
||||
func JSON(name string, typ interface{}) *jsonBuilder {
|
||||
t := reflect.TypeOf(typ)
|
||||
info := &TypeInfo{
|
||||
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.
|
||||
|
||||
@@ -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().
|
||||
|
||||
Reference in New Issue
Block a user