Skip to content

Conversation

Antonito
Copy link

Adds the ability to specify a prefix and/or suffix to generated types, allowing users to transform generated type names (ex: MyMessage -> MyMessageProto)

This is done by exposing two new APIs in prost-build:

  • package_type_name_suffix
  • package_type_name_prefix

which allows users to specify affixes on a per-package basis.

For ease of use, also provides:

  • type_name_suffix
  • type_name_prefix

to impact the current package.

// build.rs
prost_build::Config::new()
  .type_name_suffix("Proto")
  .compile_protos(...);

// same as
prost_build::Config::new()
  .package_type_name_suffix([(".", "Proto")])
  .compile_protos(...);

Example:

// external_package.proto
syntax = "proto3";

package external_package;

message ExternalMessage {
    string name = 1;
}

// type_name_imports.proto
syntax = "proto3";

package type_name_imports;

import "google/protobuf/timestamp.proto";
import "external_package.proto";

message ImportTestMessage {
    google.protobuf.Timestamp created_at = 1;
    external_package.ExternalMessage external_msg = 2;
}
// build.rs
prost_build::Config::new()
  .type_name_suffix("Proto")
  .package_type_name_suffix([(".external_package", "ABC")])
  .compile_protos(
    &[
      src.join("type_name_imports.proto"),
      src.join("external_package.proto"),
    ],
    &[src.clone(), src.join("include")],
  );

Generated code:

// This file is @generated by prost-build.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ExternalMessageABC {
    #[prost(string, tag = "1")]
    pub name: ::prost::alloc::string::String,
}

// This file is @generated by prost-build.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ImportTestMessageProto {
    #[prost(message, optional, tag = "1")]
    pub created_at: ::core::option::Option<::prost_types::Timestamp>,
    #[prost(message, optional, tag = "2")]
    pub external_msg: ::core::option::Option<
        super::external_package::ExternalMessageABC,
    >,
}

…ation

Add ability to specify global suffix and prefix for generate protobuf types,
allowing users to transform generated type names (e.g., `MyMessage` -> `MyMessageProto`)

- Add type_name_suffix() and type_name_prefix() methods to Config
- Apply affixes to messages, enums, and oneof types during code generation
- Preserve well-known types from prost_types (no suffix/prefix applied)
- Support combined prefix and suffix usage
- Add comprehensive test coverage including import scenarios

Examples:
```rust
prost_build::Config::new()
  .type_name_suffix("Proto")  // MyMessage -> MyMessageProto
  .type_name_prefix("Proto")  // MyMessage -> ProtoMyMessage
  .compile_protos(...)
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant