Skip to content

Commit

Permalink
Merge branch 'master' into fix-minimal-versions
Browse files Browse the repository at this point in the history
  • Loading branch information
LucioFranco authored Feb 23, 2024
2 parents bccfdc7 + 0a64a09 commit 96ddc37
Show file tree
Hide file tree
Showing 26 changed files with 213 additions and 37 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
matrix:
toolchain:
- stable
- "1.64"
- "1.70"
os:
- ubuntu-latest
- macos-latest
Expand Down
6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "prost"
version = "0.12.1"
version = "0.12.3"
authors = [
"Dan Burkert <[email protected]>",
"Lucio Franco <[email protected]",
Expand All @@ -14,7 +14,7 @@ description = "A Protocol Buffers implementation for the Rust Language."
keywords = ["protobuf", "serialization"]
categories = ["encoding"]
edition = "2021"
rust-version = "1.60"
rust-version = "1.70"

[workspace]
members = [
Expand Down Expand Up @@ -48,7 +48,7 @@ std = []

[dependencies]
bytes = { version = "1", default-features = false }
prost-derive = { version = "0.12.1", path = "prost-derive", optional = true }
prost-derive = { version = "0.12.3", path = "prost-derive", optional = true }

[dev-dependencies]
criterion = { version = "0.4", default-features = false }
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ start-to-finish example.

### MSRV

`prost` follows the `tokio-rs` projects MSRV model and supports 1.60. For more
`prost` follows the `tokio-rs` project's MSRV model and supports 1.70. For more
information on the tokio msrv policy you can check it out [here][tokio msrv]

[tokio msrv]: https://github.com/tokio-rs/tokio/#supported-rust-versions
Expand Down
8 changes: 4 additions & 4 deletions prost-build/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "prost-build"
version = "0.12.1"
version = "0.12.3"
authors = [
"Dan Burkert <[email protected]>",
"Lucio Franco <[email protected]>",
Expand All @@ -12,7 +12,7 @@ documentation = "https://docs.rs/prost-build"
readme = "README.md"
description = "A Protocol Buffers implementation for the Rust Language."
edition = "2021"
rust-version = "1.60"
rust-version = "1.70"

[features]
default = ["format"]
Expand All @@ -27,8 +27,8 @@ itertools = { version = ">=0.10, <0.12", default-features = false, features = ["
log = "0.4.4"
multimap = { version = "0.8", default-features = false }
petgraph = { version = "0.6", default-features = false }
prost = { version = "0.12.1", path = "..", default-features = false }
prost-types = { version = "0.12.1", path = "../prost-types", default-features = false }
prost = { version = "0.12.3", path = "..", default-features = false }
prost-types = { version = "0.12.3", path = "../prost-types", default-features = false }
tempfile = "3"
once_cell = "1.17.1"
regex = { version = "1.8.1", default-features = false, features = ["std", "unicode-bool"] }
Expand Down
92 changes: 79 additions & 13 deletions prost-build/src/code_generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ enum Syntax {
pub struct CodeGenerator<'a> {
config: &'a mut Config,
package: String,
type_path: Vec<String>,
source_info: Option<SourceCodeInfo>,
syntax: Syntax,
message_graph: &'a MessageGraph,
Expand Down Expand Up @@ -69,6 +70,7 @@ impl<'a> CodeGenerator<'a> {
let mut code_gen = CodeGenerator {
config,
package: file.package.unwrap_or_default(),
type_path: Vec::new(),
source_info,
syntax,
message_graph,
Expand Down Expand Up @@ -121,10 +123,16 @@ impl<'a> CodeGenerator<'a> {

let message_name = message.name().to_string();
let fq_message_name = format!(
"{}{}.{}",
if self.package.is_empty() { "" } else { "." },
self.package,
message.name()
"{}{}{}{}.{}",
if self.package.is_empty() && self.type_path.is_empty() {
""
} else {
"."
},
self.package.trim_matches('.'),
if self.type_path.is_empty() { "" } else { "." },
self.type_path.join("."),
message_name,
);

// Skip external types.
Expand Down Expand Up @@ -261,6 +269,55 @@ impl<'a> CodeGenerator<'a> {

self.pop_mod();
}

if self.config.enable_type_names {
self.append_type_name(&message_name, &fq_message_name);
}
}

fn append_type_name(&mut self, message_name: &str, fq_message_name: &str) {
self.buf.push_str(&format!(
"impl {}::Name for {} {{\n",
self.config.prost_path.as_deref().unwrap_or("::prost"),
to_upper_camel(&message_name)
));
self.depth += 1;

self.buf.push_str(&format!(
"const NAME: &'static str = \"{}\";\n",
message_name,
));
self.buf.push_str(&format!(
"const PACKAGE: &'static str = \"{}\";\n",
self.package,
));

let prost_path = self.config.prost_path.as_deref().unwrap_or("::prost");
let string_path = format!("{prost_path}::alloc::string::String");

let full_name = format!(
"{}{}{}{}{message_name}",
self.package.trim_matches('.'),
if self.package.is_empty() { "" } else { "." },
self.type_path.join("."),
if self.type_path.is_empty() { "" } else { "." },
);
let domain_name = self
.config
.type_name_domains
.get_first(fq_message_name)
.map_or("", |name| name.as_str());

self.buf.push_str(&format!(
r#"fn full_name() -> {string_path} {{ "{full_name}".into() }}"#,
));

self.buf.push_str(&format!(
r#"fn type_url() -> {string_path} {{ "{domain_name}/{full_name}".into() }}"#,
));

self.depth -= 1;
self.buf.push_str("}\n");
}

fn append_type_attributes(&mut self, fq_message_name: &str) {
Expand Down Expand Up @@ -645,11 +702,18 @@ impl<'a> CodeGenerator<'a> {

let enum_values = &desc.value;
let fq_proto_enum_name = format!(
"{}{}.{}",
if self.package.is_empty() { "" } else { "." },
self.package,
proto_enum_name
"{}{}{}{}.{}",
if self.package.is_empty() && self.type_path.is_empty() {
""
} else {
"."
},
self.package.trim_matches('.'),
if self.type_path.is_empty() { "" } else { "." },
self.type_path.join("."),
proto_enum_name,
);

if self
.extern_paths
.resolve_ident(&fq_proto_enum_name)
Expand Down Expand Up @@ -867,17 +931,15 @@ impl<'a> CodeGenerator<'a> {
self.buf.push_str(&to_snake(module));
self.buf.push_str(" {\n");

self.package.push('.');
self.package.push_str(module);
self.type_path.push(module.into());

self.depth += 1;
}

fn pop_mod(&mut self) {
self.depth -= 1;

let idx = self.package.rfind('.').unwrap();
self.package.truncate(idx);
self.type_path.pop();

self.push_indent();
self.buf.push_str("}\n");
Expand Down Expand Up @@ -915,7 +977,11 @@ impl<'a> CodeGenerator<'a> {
return proto_ident;
}

let mut local_path = self.package.split('.').peekable();
let mut local_path = self
.package
.split('.')
.chain(self.type_path.iter().map(String::as_str))
.peekable();

// If no package is specified the start of the package name will be '.'
// and split will return an empty string ("") which breaks resolution
Expand Down
1 change: 1 addition & 0 deletions prost-build/src/fixtures/alphabet/_expected_include.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// This file is @generated by prost-build.
pub mod a {
include!("a.rs");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// This file is @generated by prost-build.
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Container {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// This file is @generated by prost-build.
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Container {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// This file is @generated by prost-build.
#[derive(derive_builder::Builder)]
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// This file is @generated by prost-build.
#[derive(derive_builder::Builder)]
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// This file is @generated by prost-build.
pub mod com {
pub mod prost_test {
pub mod test {
Expand Down
58 changes: 57 additions & 1 deletion prost-build/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#![doc(html_root_url = "https://docs.rs/prost-build/0.12.1")]
#![doc(html_root_url = "https://docs.rs/prost-build/0.12.2")]
#![allow(clippy::option_as_ref_deref, clippy::format_push_string)]

//! `prost-build` compiles `.proto` files into Rust.
Expand Down Expand Up @@ -253,6 +253,8 @@ pub struct Config {
out_dir: Option<PathBuf>,
extern_paths: Vec<(String, String)>,
default_package_filename: String,
enable_type_names: bool,
type_name_domains: PathMap<String>,
protoc_args: Vec<OsString>,
disable_comments: PathMap<()>,
skip_debug: PathMap<()>,
Expand Down Expand Up @@ -839,6 +841,46 @@ impl Config {
self
}

/// Configures the code generator to include type names.
///
/// Message types will implement `Name` trait, which provides type and package name.
/// This is needed for encoding messages as `Any` type.
pub fn enable_type_names(&mut self) -> &mut Self {
self.enable_type_names = true;
self
}

/// Specify domain names to use with message type URLs.
///
/// # Domains
///
/// **`paths`** - a path matching any number of types. It works the same way as in
/// [`btree_map`](#method.btree_map), just with the field name omitted.
///
/// **`domain`** - an arbitrary string to be used as a prefix for type URLs.
///
/// # Examples
///
/// ```rust
/// # let mut config = prost_build::Config::new();
/// // Full type URL of the message `google.profile.Person`,
/// // will be `type.googleapis.com/google.profile.Person`.
/// config.type_name_domain(&["."], "type.googleapis.com");
/// ```
pub fn type_name_domain<I, S, D>(&mut self, paths: I, domain: D) -> &mut Self
where
I: IntoIterator<Item = S>,
S: AsRef<str>,
D: AsRef<str>,
{
self.type_name_domains.clear();
for matcher in paths {
self.type_name_domains
.insert(matcher.as_ref().to_string(), domain.as_ref().to_string());
}
self
}

/// Configures the path that's used for deriving `Message` for generated messages.
/// This is mainly useful for generating crates that wish to re-export prost.
/// Defaults to `::prost::Message` if not specified.
Expand Down Expand Up @@ -989,6 +1031,7 @@ impl Config {
if let Some(ref include_file) = self.include_file {
trace!("Writing include file: {:?}", target.join(include_file));
let mut file = fs::File::create(target.join(include_file))?;
self.write_line(&mut file, 0, "// This file is @generated by prost-build.")?;
self.write_includes(
modules.keys().collect(),
&mut file,
Expand Down Expand Up @@ -1224,9 +1267,18 @@ impl Config {
self.fmt_modules(&mut modules);
}

self.add_generated_modules(&mut modules);

Ok(modules)
}

fn add_generated_modules(&mut self, modules: &mut HashMap<Module, String>) {
for buf in modules.values_mut() {
let with_generated = "// This file is @generated by prost-build.\n".to_string() + buf;
*buf = with_generated;
}
}

#[cfg(feature = "format")]
fn fmt_modules(&mut self, modules: &mut HashMap<Module, String>) {
for buf in modules.values_mut() {
Expand Down Expand Up @@ -1257,6 +1309,8 @@ impl default::Default for Config {
out_dir: None,
extern_paths: Vec::new(),
default_package_filename: "_".to_string(),
enable_type_names: false,
type_name_domains: PathMap::default(),
protoc_args: Vec::new(),
disable_comments: PathMap::default(),
skip_debug: PathMap::default(),
Expand All @@ -1282,6 +1336,8 @@ impl fmt::Debug for Config {
.field("out_dir", &self.out_dir)
.field("extern_paths", &self.extern_paths)
.field("default_package_filename", &self.default_package_filename)
.field("enable_type_names", &self.enable_type_names)
.field("type_name_domains", &self.type_name_domains)
.field("protoc_args", &self.protoc_args)
.field("disable_comments", &self.disable_comments)
.field("skip_debug", &self.skip_debug)
Expand Down
4 changes: 2 additions & 2 deletions prost-derive/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "prost-derive"
version = "0.12.1"
version = "0.12.3"
authors = [
"Dan Burkert <[email protected]>",
"Lucio Franco <[email protected]>",
Expand All @@ -12,7 +12,7 @@ documentation = "https://docs.rs/prost-derive"
readme = "README.md"
description = "A Protocol Buffers implementation for the Rust Language."
edition = "2021"
rust-version = "1.60"
rust-version = "1.70"

[lib]
proc_macro = true
Expand Down
2 changes: 1 addition & 1 deletion prost-derive/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#![doc(html_root_url = "https://docs.rs/prost-derive/0.12.1")]
#![doc(html_root_url = "https://docs.rs/prost-derive/0.12.2")]
// The `quote!` macro requires deep recursion.
#![recursion_limit = "4096"]

Expand Down
Loading

0 comments on commit 96ddc37

Please sign in to comment.