Ficheros .proto
En Sword, los ficheros .proto definen el contrato público de tu servicio gRPC. Este contrato luego se convierte en código Rust mediante tonic y tonic-prost-build.
Ubicación recomendada
Recomendamos guardar los .proto bajo config/proto/.
Esto facilita:
- mantener una estructura predecible entre proyectos,
- reutilizar el mismo patrón en
build.rs, - separar contratos de transporte del resto del código de aplicación.
Ejemplo:
config/
proto/
users.protoConvenciones de naming
Estas reglas buscan evitar ambigüedad con servicios internos de tu aplicación y mantener contratos claros para clientes externos.
Services
Usa el sufijo GrpcService en servicios proto, porque en tu código de aplicación pueden coexistir servicios de negocio con nombres similares.
Recomendado:
service UserGrpcService {
rpc GetUser (GetUserRequest) returns (GetUserResponse);
}No recomendado:
service UserService {
rpc GetUser (GetUserRequest) returns (GetUserResponse);
}Métodos RPC
Nombra métodos por intención (Get, List, Create, Update, Delete, Stream) para que el contrato sea autoexplicativo para quien lo consume.
Recomendado:
rpc GetUser (GetUserRequest) returns (GetUserResponse);
rpc ListUsers (ListUsersRequest) returns (ListUsersResponse);
rpc StreamUsers (StreamUsersRequest) returns (stream User);No recomendado:
rpc UserGet (GetUserRequest) returns (GetUserResponse);
rpc DoUserAction (ListUsersRequest) returns (ListUsersResponse);Messages
Evita prefijos/sufijos técnicos como Grpc en message. En contratos públicos, es mejor usar nombres neutrales y orientados al dominio.
Recomendado:
message GetUserRequest {
string id = 1;
}
message GetUserResponse {
User user = 1;
}No recomendado:
message GetUserGrpcRequest {
string id = 1;
}
message GetUserGrpcResponse {
UserGrpcModel user = 1;
}Fichero build.rs
En tu build.rs, asegúrate de configurar tonic-prost-build para compilar tus .proto desde la ubicación que has elegido. Por ejemplo:
fn main() -> Result<(), Box<dyn std::error::Error>> {
tonic_prost_build::configure()
.compile_protos(&["config/proto/users.proto"], &["config/proto"])?;
Ok(())
}
