Linter rulesProtobufrpc-response-standard-name
rpc-response-standard-name
Since 0.9.0
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: whethergoogle.protobuf.Emptyis accepted as a response type (defaultfalse). The type is resolved, so.google.protobuf.Emptyis recognized, too.allow_google_protobuf_empty_requests: accepted for symmetry with the related rules, but ignored by this rule.
Configuration Example
version: "1.0"
commands:
lint:
protobuf:
rules:
rpc-response-standard-name:
- warning
- allow_google_protobuf_empty_responses: true
Examples
Good. With the default configuration.
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.
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'.
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.