# rpc-response-standard-name

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

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

## Rule Details

When every RPC has its own response message, fields can be added to the response of one RPC
without changing the others: returning a bare `Pet` from `GetPet` leaves no room for metadata
that only this RPC needs. Naming the message after the RPC makes this one-to-one relation
visible.

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

`Response type of RPC '<rpc>' should be named '<rpc>Response' or '<service><rpc>Response', 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_responses`: whether `google.protobuf.Empty` is accepted as a
  response type (default `false`). The type is resolved, so `.google.protobuf.Empty` is
  recognized, too.
- `allow_google_protobuf_empty_requests`: accepted for symmetry with the related rules, but
  ignored by this rule.

**Configuration Example**

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

## Examples

**Good**. With the default configuration.

```proto
syntax = "proto3";

package acme.pets.v1;

service PetService {
  rpc GetPet(GetPetRequest) returns (GetPetResponse);
  rpc ListPets(ListPetsRequest) returns (PetServiceListPetsResponse);
}

message GetPetRequest {
  string name = 1;
}

message GetPetResponse {
  string name = 1;
}

message ListPetsRequest {
  int32 page_size = 1;
}

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

**Good**. With `allow_google_protobuf_empty_responses: true`.

```proto
syntax = "proto3";

package acme.pets.v1;

import "google/protobuf/empty.proto";

service PetService {
  rpc DeletePet(DeletePetRequest) returns (google.protobuf.Empty);
}

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

**Bad**. With the default configuration, the linter reports
`Response type of RPC 'GetPet' should be named 'GetPetResponse' or 'PetServiceGetPetResponse', not 'Pet'`.

```proto
syntax = "proto3";

package acme.pets.v1;

service PetService {
  rpc GetPet(GetPetRequest) returns (Pet);
}

message GetPetRequest {
  string name = 1;
}

message Pet {
  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-response-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 response 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.
