Skip to Content

Enums

How Protobuf enums are converted to GraphQL enums.

Basic Conversion

enum Role { ROLE_UNSPECIFIED = 0; ROLE_ADMIN = 1; ROLE_USER = 2; }
enum Role { ADMIN USER }

UNSPECIFIED Value Handling

Enum values with the pattern <ENUM_NAME>_UNSPECIFIED at position 0 are automatically excluded from GraphQL:

enum Status { STATUS_UNSPECIFIED = 0; # Excluded STATUS_ACTIVE = 1; STATUS_INACTIVE = 2; }
enum Status { ACTIVE INACTIVE }

Non-UNSPECIFIED Zero Values

If the zero value doesn’t follow the _UNSPECIFIED pattern, it’s included:

enum Priority { LOW = 0; # Included (not _UNSPECIFIED) MEDIUM = 1; HIGH = 2; }
enum Priority { LOW MEDIUM HIGH }

Value Name Conversion

Enum value names have the enum name prefix removed:

ProtobufGraphQL
MY_ENUM_FOOFOO
MY_ENUM_BARBAR
MY_ENUM_BAZBAZ
enum MyEnum { MY_ENUM_UNSPECIFIED = 0; MY_ENUM_FOO = 1; MY_ENUM_BAR = 2; }
enum MyEnum { FOO BAR }

Renaming Enums

Override the GraphQL enum name with (graphql.enum_type).name:

enum InternalStatus { option (graphql.enum_type).name = "Status"; INTERNAL_STATUS_UNSPECIFIED = 0; INTERNAL_STATUS_ACTIVE = 1; }
enum Status { ACTIVE }

Ignoring Enums

Exclude an enum from generation:

enum Internal { option (graphql.enum_type).ignore = true; INTERNAL_UNSPECIFIED = 0; INTERNAL_VALUE = 1; }

No GraphQL enum is generated.

Ignoring Enum Values

Exclude specific values:

enum Role { ROLE_UNSPECIFIED = 0; ROLE_ADMIN = 1; ROLE_USER = 2; ROLE_DEPRECATED = 3 [(graphql.enum_value).ignore = true]; }
enum Role { ADMIN USER # DEPRECATED not included }

Enums in Fields

message User { // Required. Role role = 1; repeated Role additional_roles = 2; }
type User { role: Role! additionalRoles: [Role!]! }