# enum-value-prefix

Source: https://apigenie.pl/docs/linter/protobuf/rules/enum-value-prefix

This rule checks whether the names of the values of every enum start with the name of the enum
in `UPPER_SNAKE_CASE`, for example `PET_KIND_DOG` in the enum `PetKind`.

## Rule Details

Protobuf enum values follow C++ scoping rules: they are siblings of their enum, not children of
it. Two enums of the same package or message therefore cannot both have a value named `UNKNOWN`
or `OTHER`. Prefixing every value with the name of its enum avoids such clashes, and keeps the
values unambiguous in the generated code of languages without scoped enums.

The `enum-value-prefix` rule converts the name of each enum to `UPPER_SNAKE_CASE` and appends an
underscore, and reports `Enum value '<value>' should start with '<prefix>'` for every value whose
name does not start with this prefix. The name is split into words at underscores, at
lower-to-upper case changes and before the last capital of an acronym, so the prefix of
`HTTPMethod` is `HTTP_METHOD_`.

The prefix is made of the name of the enum only, also for enums nested in messages.

## Configuration

This rule has no options.

## Examples

**Good**.

```proto
syntax = "proto3";

package acme.pets.v1;

enum PetKind {
  PET_KIND_UNSPECIFIED = 0;
  PET_KIND_DOG = 1;
  PET_KIND_CAT = 2;
}
```

**Bad**. The linter reports `Enum value 'UNSPECIFIED' should start with 'PET_KIND_'`,
`Enum value 'DOG' should start with 'PET_KIND_'` and
`Enum value 'CAT' should start with 'PET_KIND_'`.

```proto
syntax = "proto3";

package acme.pets.v1;

enum PetKind {
  UNSPECIFIED = 0;
  DOG = 1;
  CAT = 2;
}
```

## When Not to Use It

You may disable this rule if the enum values are part of an existing API that you cannot rename.
To allow the values of a single enum, add an `// apigenie-lint-disable enum-value-prefix` comment
to the enum.

## Compatibility

This rule is compatible with proto3 files. proto2 and editions files are rejected by the reader
and are not linted.
