# rpc-request-standard-name

Source: https://apigenie.pl/docs/linter/protobuf/rules/rpc-request-standard-name

This rule checks whether the request type of every RPC is named after the RPC, for example
`GetPetRequest` for the RPC `GetPet`.

## Rule Details

When every RPC has its own request message, fields can be added to the request of one RPC
without changing the others. Naming the message after the RPC makes this one-to-one relation
visible.

The `rpc-request-standard-name` rule accepts two names for the request type of the RPC `<rpc>`
in the service `<service>`: `<rpc>Request` and `<service><rpc>Request`. Only the last component
of the type name is compared, so `acme.pets.v1.GetPetRequest` is accepted as well. For any other
request type, the rule reports:

`Request type of RPC '<rpc>' should be named '<rpc>Request' or '<service><rpc>Request', not '<type>'`

where `<type>` is the type name as written in the RPC.

## Configuration

The configuration block is an object with boolean properties:

- `allow_google_protobuf_empty_requests`: whether `google.protobuf.Empty` is accepted as a
  request type (default `false`). The type is resolved, so `.google.protobuf.Empty` is
  recognized, too.
- `allow_google_protobuf_empty_responses`: accepted for symmetry with the related rules, but
  ignored by this rule.

**Configuration Example**

```yaml
version: "1.0"
commands:
  lint:
    protobuf:
      rules:
        rpc-request-standard-name:
          - warning
          - allow_google_protobuf_empty_requests: true
```

## Examples

**Good**. With the default configuration.

```proto
syntax = "proto3";

package acme.pets.v1;

service PetService {
  rpc GetPet(GetPetRequest) returns (GetPetResponse);
  rpc ListPets(PetServiceListPetsRequest) returns (ListPetsResponse);
}

message GetPetRequest {
  string name = 1;
}

message GetPetResponse {
  string name = 1;
}

message PetServiceListPetsRequest {
  int32 page_size = 1;
}

message ListPetsResponse {
  repeated string names = 1;
}
```

**Bad**. With the default configuration, the linter reports
`Request type of RPC 'GetPet' should be named 'GetPetRequest' or 'PetServiceGetPetRequest', not 'PetId'`.

```proto
syntax = "proto3";

package acme.pets.v1;

service PetService {
  rpc GetPet(PetId) returns (GetPetResponse);
}

message PetId {
  string name = 1;
}

message GetPetResponse {
  string name = 1;
}
```

## When Not to Use It

You may disable this rule if the RPCs are part of an existing API that you cannot change. To
allow a single RPC, add an `// apigenie-lint-disable rpc-request-standard-name` comment to it.

## Compatibility

This rule is compatible with proto3 files. proto2 and editions files are rejected by the reader
and are not linted. To recognize `google.protobuf.Empty`, the rule resolves the request types
among the declarations of the file and of the files it imports; `google/protobuf/empty.proto` is
known built in. A type that cannot be resolved is compared as written, without a leading dot.
