mirror of
https://github.com/ent/ent.git
synced 2026-04-28 05:30:56 +03:00
schema/field: add GoType support for enum fields (#638)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user