From 46cf7ad36af63f0961a42c2278982b3cb0671e4c Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Mon, 31 May 2021 09:51:15 +0300 Subject: [PATCH] schema/field: store reflect type info in json fields --- examples/privacytenant/ent/internal/schema.go | 2 +- schema/field/field.go | 23 ++++++++++--------- schema/field/field_test.go | 13 +++++++++++ 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/examples/privacytenant/ent/internal/schema.go b/examples/privacytenant/ent/internal/schema.go index d3431304c..9587ac331 100644 --- a/examples/privacytenant/ent/internal/schema.go +++ b/examples/privacytenant/ent/internal/schema.go @@ -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"]}` diff --git a/schema/field/field.go b/schema/field/field.go index a5f369336..e90b123d4 100644 --- a/schema/field/field.go +++ b/schema/field/field.go @@ -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. diff --git a/schema/field/field_test.go b/schema/field/field_test.go index d4c0c8575..0eb3cdbc4 100644 --- a/schema/field/field_test.go +++ b/schema/field/field_test.go @@ -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().