schema/field: add GoType support for enum fields (#638)

This commit is contained in:
Ariel Mashraki
2020-07-24 19:59:05 +03:00
committed by GitHub
parent 6564b0026d
commit 04859c6fb4
20 changed files with 424 additions and 32 deletions

View File

@@ -732,6 +732,22 @@ func (b *enumBuilder) Annotations(annotations ...Annotation) *enumBuilder {
return b
}
// EnumValues defines the interface for getting the enum values.
type EnumValues interface {
Values() []string
}
// GoType overrides the default Go type with a custom one.
//
// field.Enum("enum").
// GoType(role.Enum("role"))
//
func (b *enumBuilder) GoType(ev EnumValues) *enumBuilder {
b.Values(ev.Values()...)
b.desc.goType(ev, stringType)
return b
}
// Descriptor implements the ent.Field interface by returning its descriptor.
func (b *enumBuilder) Descriptor() *Descriptor {
return b.desc

View File

@@ -326,6 +326,12 @@ func TestField_Tag(t *testing.T) {
assert.Equal(t, `json:"expired,omitempty"`, fd.Tag)
}
type Role string
func (Role) Values() []string {
return []string{"admin", "owner"}
}
func TestField_Enums(t *testing.T) {
fd := field.Enum("role").
Values(
@@ -338,6 +344,15 @@ func TestField_Enums(t *testing.T) {
assert.Equal(t, "role", fd.Name)
assert.Equal(t, map[string]string{"admin": "admin", "master": "master", "user": "user"}, fd.Enums)
assert.Equal(t, "user", fd.Default)
fd = field.Enum("role").GoType(Role("")).Descriptor()
assert.NoError(t, fd.Err())
assert.Equal(t, "field_test.Role", fd.Info.Ident)
assert.Equal(t, "github.com/facebookincubator/ent/schema/field_test", fd.Info.PkgPath)
assert.Equal(t, "field_test.Role", fd.Info.String())
assert.False(t, fd.Info.Nillable)
assert.False(t, fd.Info.ValueScanner())
assert.Equal(t, map[string]string{"admin": "admin", "owner": "owner"}, fd.Enums)
}
func TestField_UUID(t *testing.T) {