Skip to content

Commit

Permalink
[Prost] Remove extra generated modules and opt-in to transitively inc…
Browse files Browse the repository at this point in the history
…luding deps (#2943)

This PR makes two changes:
1. It removes the duplicately generated code in the prost `lib.rs`.
2. It allows opting into transitively including all of the proto deps.

## Duplicately generated code.

Previously there was a bug where we generated the same code at every
proto package level. This created separate Rust types for each module
which made it easy to accidentally import an incompatible type.

Before:
```rust
// @generated

pub mod b_ar {
    pub mod b_az {
        pub mod qaz {
            pub mod qu_x {
                // @generated
                // This file is @generated by prost-build.
                #[allow(clippy::derive_partial_eq_without_eq)]
                #[derive(Clone, PartialEq, ::prost::Message)]
                pub struct Bar {
                    #[prost(string, tag = "1")]
                    pub name: ::prost::alloc::string::String,
                    #[prost(message, optional, tag = "2")]
                    pub foo: ::core::option::Option<
                        ::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::Foo,
                    >,
                    #[prost(message, optional, tag = "3")]
                    pub nested_foo: ::core::option::Option<
                        ::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::foo::NestedFoo,
                    >,
                }
                /// Nested message and enum types in `Bar`.
                pub mod bar {
                    #[allow(clippy::derive_partial_eq_without_eq)]
                    #[derive(Clone, PartialEq, ::prost::Message)]
                    pub struct Baz {
                        #[prost(string, tag = "4")]
                        pub name: ::prost::alloc::string::String,
                    }
                }
                // @@protoc_insertion_point(module)
            }
        }
    }
}
pub mod b_az {
    pub mod qaz {
        pub mod qu_x {
            // @generated
            // This file is @generated by prost-build.
            #[allow(clippy::derive_partial_eq_without_eq)]
            #[derive(Clone, PartialEq, ::prost::Message)]
            pub struct Bar {
                #[prost(string, tag = "1")]
                pub name: ::prost::alloc::string::String,
                #[prost(message, optional, tag = "2")]
                pub foo:
                    ::core::option::Option<::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::Foo>,
                #[prost(message, optional, tag = "3")]
                pub nested_foo: ::core::option::Option<
                    ::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::foo::NestedFoo,
                >,
            }
            /// Nested message and enum types in `Bar`.
            pub mod bar {
                #[allow(clippy::derive_partial_eq_without_eq)]
                #[derive(Clone, PartialEq, ::prost::Message)]
                pub struct Baz {
                    #[prost(string, tag = "4")]
                    pub name: ::prost::alloc::string::String,
                }
            }
            // @@protoc_insertion_point(module)
        }
    }
}
pub mod qaz {
    pub mod qu_x {
        // @generated
        // This file is @generated by prost-build.
        #[allow(clippy::derive_partial_eq_without_eq)]
        #[derive(Clone, PartialEq, ::prost::Message)]
        pub struct Bar {
            #[prost(string, tag = "1")]
            pub name: ::prost::alloc::string::String,
            #[prost(message, optional, tag = "2")]
            pub foo: ::core::option::Option<::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::Foo>,
            #[prost(message, optional, tag = "3")]
            pub nested_foo: ::core::option::Option<
                ::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::foo::NestedFoo,
            >,
        }
        /// Nested message and enum types in `Bar`.
        pub mod bar {
            #[allow(clippy::derive_partial_eq_without_eq)]
            #[derive(Clone, PartialEq, ::prost::Message)]
            pub struct Baz {
                #[prost(string, tag = "4")]
                pub name: ::prost::alloc::string::String,
            }
        }
        // @@protoc_insertion_point(module)
    }
}
pub mod qu_x {
    // @generated
    // This file is @generated by prost-build.
    #[allow(clippy::derive_partial_eq_without_eq)]
    #[derive(Clone, PartialEq, ::prost::Message)]
    pub struct Bar {
        #[prost(string, tag = "1")]
        pub name: ::prost::alloc::string::String,
        #[prost(message, optional, tag = "2")]
        pub foo: ::core::option::Option<::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::Foo>,
        #[prost(message, optional, tag = "3")]
        pub nested_foo: ::core::option::Option<
            ::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::foo::NestedFoo,
        >,
    }
    /// Nested message and enum types in `Bar`.
    pub mod bar {
        #[allow(clippy::derive_partial_eq_without_eq)]
        #[derive(Clone, PartialEq, ::prost::Message)]
        pub struct Baz {
            #[prost(string, tag = "4")]
            pub name: ::prost::alloc::string::String,
        }
    }
    // @@protoc_insertion_point(module)
}

```

Now:
```rust
// @generated

pub use foo_proto;

pub mod b_ar {
    pub mod b_az {
        pub mod qaz {
            pub mod qu_x {
                // @generated
                // This file is @generated by prost-build.
                #[allow(clippy::derive_partial_eq_without_eq)]
                #[derive(Clone, PartialEq, ::prost::Message)]
                pub struct Bar {
                    #[prost(string, tag = "1")]
                    pub name: ::prost::alloc::string::String,
                    #[prost(message, optional, tag = "2")]
                    pub foo: ::core::option::Option<
                        ::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::Foo,
                    >,
                    #[prost(message, optional, tag = "3")]
                    pub nested_foo: ::core::option::Option<
                        ::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::foo::NestedFoo,
                    >,
                }
                /// Nested message and enum types in `Bar`.
                pub mod bar {
                    #[allow(clippy::derive_partial_eq_without_eq)]
                    #[derive(Clone, PartialEq, ::prost::Message)]
                    pub struct Baz {
                        #[prost(string, tag = "4")]
                        pub name: ::prost::alloc::string::String,
                    }
                }
                // @@protoc_insertion_point(module)
            }
        }
    }
}
```

## Including transitive depenencies.

Because the proto rules rely on aspects, we are compiling targets which
may not be directly accessible as a label in Bazel. Out of convenience,
the original implementation automatically included all transitive
dependencies to the `rust_library` or `rust_binary` that depended on the
proto crate.

As an example, let's say we have the following hierarchy:
```
my_crate -> a.proto
a.proto -> b.proto
b.proto -> c.proto
```
The previous setup made it possible for `my_crate` to directly import
`a_proto`, `b_proto`, and `c_proto`.

This is problematic though because it leads to significant crate
dependency bloat. `my_crate` may only use `a_proto` directly but it now
also depends on the unused crates `b_proto` and `c_proto`.


This PR makes every generated crate re-export its direct dependencies.
So, for the same example we now can import via those reexports:
```rust
//! my_crate
use a_proto::A;
use a_proto::b_proto::B;
use a_proto::b_proto::c_proto::C;
```

This means that you can also add the rustc flag
`-Dunused_crate_dependencies` to ensure you're not depending on crates
which are unused. In our monorepo we've had to disable this flag for
crates depending on protos.

If you need to depend on an intermediate crate directly, you can just
add a `rust_prost_library` definition and since it's all generated with
aspects, it will be the identical underlying crate.

Finally, if you really want the extra crates included, you can set the
flag `include_transitive_deps` on the prost toolchain and that will
bring back the previous behavior.
  • Loading branch information
freeformstu authored Oct 18, 2024
1 parent 0c6bcc8 commit 5d8d989
Show file tree
Hide file tree
Showing 14 changed files with 241 additions and 102 deletions.
6 changes: 4 additions & 2 deletions docs/src/flatten.md
Original file line number Diff line number Diff line change
Expand Up @@ -795,8 +795,9 @@ Builds a Rust proc-macro crate.
## rust_prost_toolchain

<pre>
rust_prost_toolchain(<a href="#rust_prost_toolchain-name">name</a>, <a href="#rust_prost_toolchain-prost_opts">prost_opts</a>, <a href="#rust_prost_toolchain-prost_plugin">prost_plugin</a>, <a href="#rust_prost_toolchain-prost_plugin_flag">prost_plugin_flag</a>, <a href="#rust_prost_toolchain-prost_runtime">prost_runtime</a>, <a href="#rust_prost_toolchain-prost_types">prost_types</a>,
<a href="#rust_prost_toolchain-proto_compiler">proto_compiler</a>, <a href="#rust_prost_toolchain-tonic_opts">tonic_opts</a>, <a href="#rust_prost_toolchain-tonic_plugin">tonic_plugin</a>, <a href="#rust_prost_toolchain-tonic_plugin_flag">tonic_plugin_flag</a>, <a href="#rust_prost_toolchain-tonic_runtime">tonic_runtime</a>)
rust_prost_toolchain(<a href="#rust_prost_toolchain-name">name</a>, <a href="#rust_prost_toolchain-include_transitive_deps">include_transitive_deps</a>, <a href="#rust_prost_toolchain-prost_opts">prost_opts</a>, <a href="#rust_prost_toolchain-prost_plugin">prost_plugin</a>, <a href="#rust_prost_toolchain-prost_plugin_flag">prost_plugin_flag</a>,
<a href="#rust_prost_toolchain-prost_runtime">prost_runtime</a>, <a href="#rust_prost_toolchain-prost_types">prost_types</a>, <a href="#rust_prost_toolchain-proto_compiler">proto_compiler</a>, <a href="#rust_prost_toolchain-tonic_opts">tonic_opts</a>, <a href="#rust_prost_toolchain-tonic_plugin">tonic_plugin</a>,
<a href="#rust_prost_toolchain-tonic_plugin_flag">tonic_plugin_flag</a>, <a href="#rust_prost_toolchain-tonic_runtime">tonic_runtime</a>)
</pre>

Rust Prost toolchain rule.
Expand All @@ -807,6 +808,7 @@ Rust Prost toolchain rule.
| Name | Description | Type | Mandatory | Default |
| :------------- | :------------- | :------------- | :------------- | :------------- |
| <a id="rust_prost_toolchain-name"></a>name | A unique name for this target. | <a href="https://bazel.build/concepts/labels#target-names">Name</a> | required | |
| <a id="rust_prost_toolchain-include_transitive_deps"></a>include_transitive_deps | Whether to include transitive dependencies. If set to True, all transitive dependencies will directly accessible by the dependent crate. | Boolean | optional | `False` |
| <a id="rust_prost_toolchain-prost_opts"></a>prost_opts | Additional options to add to Prost. | List of strings | optional | `[]` |
| <a id="rust_prost_toolchain-prost_plugin"></a>prost_plugin | Additional plugins to add to Prost. | <a href="https://bazel.build/concepts/labels">Label</a> | required | |
| <a id="rust_prost_toolchain-prost_plugin_flag"></a>prost_plugin_flag | Prost plugin flag format. (e.g. `--plugin=protoc-gen-prost=%s`) | String | optional | `"--plugin=protoc-gen-prost=%s"` |
Expand Down
6 changes: 4 additions & 2 deletions docs/src/rust_proto.md
Original file line number Diff line number Diff line change
Expand Up @@ -302,8 +302,9 @@ rust_binary(
## rust_prost_toolchain

<pre>
rust_prost_toolchain(<a href="#rust_prost_toolchain-name">name</a>, <a href="#rust_prost_toolchain-prost_opts">prost_opts</a>, <a href="#rust_prost_toolchain-prost_plugin">prost_plugin</a>, <a href="#rust_prost_toolchain-prost_plugin_flag">prost_plugin_flag</a>, <a href="#rust_prost_toolchain-prost_runtime">prost_runtime</a>, <a href="#rust_prost_toolchain-prost_types">prost_types</a>,
<a href="#rust_prost_toolchain-proto_compiler">proto_compiler</a>, <a href="#rust_prost_toolchain-tonic_opts">tonic_opts</a>, <a href="#rust_prost_toolchain-tonic_plugin">tonic_plugin</a>, <a href="#rust_prost_toolchain-tonic_plugin_flag">tonic_plugin_flag</a>, <a href="#rust_prost_toolchain-tonic_runtime">tonic_runtime</a>)
rust_prost_toolchain(<a href="#rust_prost_toolchain-name">name</a>, <a href="#rust_prost_toolchain-include_transitive_deps">include_transitive_deps</a>, <a href="#rust_prost_toolchain-prost_opts">prost_opts</a>, <a href="#rust_prost_toolchain-prost_plugin">prost_plugin</a>, <a href="#rust_prost_toolchain-prost_plugin_flag">prost_plugin_flag</a>,
<a href="#rust_prost_toolchain-prost_runtime">prost_runtime</a>, <a href="#rust_prost_toolchain-prost_types">prost_types</a>, <a href="#rust_prost_toolchain-proto_compiler">proto_compiler</a>, <a href="#rust_prost_toolchain-tonic_opts">tonic_opts</a>, <a href="#rust_prost_toolchain-tonic_plugin">tonic_plugin</a>,
<a href="#rust_prost_toolchain-tonic_plugin_flag">tonic_plugin_flag</a>, <a href="#rust_prost_toolchain-tonic_runtime">tonic_runtime</a>)
</pre>

Rust Prost toolchain rule.
Expand All @@ -314,6 +315,7 @@ Rust Prost toolchain rule.
| Name | Description | Type | Mandatory | Default |
| :------------- | :------------- | :------------- | :------------- | :------------- |
| <a id="rust_prost_toolchain-name"></a>name | A unique name for this target. | <a href="https://bazel.build/concepts/labels#target-names">Name</a> | required | |
| <a id="rust_prost_toolchain-include_transitive_deps"></a>include_transitive_deps | Whether to include transitive dependencies. If set to True, all transitive dependencies will directly accessible by the dependent crate. | Boolean | optional | `False` |
| <a id="rust_prost_toolchain-prost_opts"></a>prost_opts | Additional options to add to Prost. | List of strings | optional | `[]` |
| <a id="rust_prost_toolchain-prost_plugin"></a>prost_plugin | Additional plugins to add to Prost. | <a href="https://bazel.build/concepts/labels">Label</a> | required | |
| <a id="rust_prost_toolchain-prost_plugin_flag"></a>prost_plugin_flag | Prost plugin flag format. (e.g. `--plugin=protoc-gen-prost=%s`) | String | optional | `"--plugin=protoc-gen-prost=%s"` |
Expand Down
6 changes: 6 additions & 0 deletions proto/prost/private/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,19 @@ bzl_library(

rust_library_group(
name = "prost_runtime",
visibility = [
"//proto/prost:__subpackages__",
],
deps = [
"//proto/prost/private/3rdparty/crates:prost",
],
)

rust_library_group(
name = "tonic_runtime",
visibility = [
"//proto/prost:__subpackages__",
],
deps = [
":prost_runtime",
"//proto/prost/private/3rdparty/crates:tonic",
Expand Down
20 changes: 18 additions & 2 deletions proto/prost/private/prost.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ def _compile_proto(ctx, crate_name, proto_info, deps, prost_toolchain, rustfmt_t
proto_compiler = prost_toolchain.proto_compiler
tools = depset([proto_compiler.executable])

direct_crate_names = [dep[ProstProtoInfo].dep_variant_info.crate_info.name for dep in deps]
additional_args = ctx.actions.args()

# Prost process wrapper specific args
Expand All @@ -61,6 +62,7 @@ def _compile_proto(ctx, crate_name, proto_info, deps, prost_toolchain, rustfmt_t
additional_args.add("--out_librs={}".format(lib_rs.path))
additional_args.add("--package_info_output={}".format("{}={}".format(crate_name, package_info_file.path)))
additional_args.add("--deps_info={}".format(deps_info_file.path))
additional_args.add("--direct_dep_crate_names={}".format(",".join(direct_crate_names)))
additional_args.add("--prost_opt=compile_well_known_types")
additional_args.add("--descriptor_set={}".format(proto_info.direct_descriptor_set.path))
additional_args.add_all(prost_toolchain.prost_opts, format_each = "--prost_opt=%s")
Expand Down Expand Up @@ -199,7 +201,7 @@ def _rust_prost_aspect_impl(target, ctx):
runtime_deps = []

rustfmt_toolchain = ctx.toolchains["@rules_rust//rust/rustfmt:toolchain_type"]
prost_toolchain = ctx.toolchains["@rules_rust//proto/prost:toolchain_type"]
prost_toolchain = ctx.toolchains[TOOLCHAIN_TYPE]
for prost_runtime in [prost_toolchain.prost_runtime, prost_toolchain.tonic_runtime]:
if not prost_runtime:
continue
Expand Down Expand Up @@ -316,12 +318,18 @@ def _rust_prost_library_impl(ctx):
rust_proto_info = proto_dep[ProstProtoInfo]
dep_variant_info = rust_proto_info.dep_variant_info

prost_toolchain = ctx.toolchains[TOOLCHAIN_TYPE]

transitive = []
if prost_toolchain.include_transitive_deps:
transitive = [rust_proto_info.transitive_dep_infos]

return [
DefaultInfo(files = depset([dep_variant_info.crate_info.output])),
rust_common.crate_group_info(
dep_variant_infos = depset(
[dep_variant_info],
transitive = [rust_proto_info.transitive_dep_infos],
transitive = transitive,
),
),
RustAnalyzerGroupInfo(deps = [proto_dep[RustAnalyzerInfo]]),
Expand All @@ -343,6 +351,9 @@ rust_prost_library = rule(
cfg = "exec",
),
},
toolchains = [
TOOLCHAIN_TYPE,
],
)

def _rust_prost_toolchain_impl(ctx):
Expand Down Expand Up @@ -375,13 +386,18 @@ def _rust_prost_toolchain_impl(ctx):
tonic_plugin = ctx.attr.tonic_plugin,
tonic_plugin_flag = ctx.attr.tonic_plugin_flag,
tonic_runtime = ctx.attr.tonic_runtime,
include_transitive_deps = ctx.attr.include_transitive_deps,
)]

rust_prost_toolchain = rule(
implementation = _rust_prost_toolchain_impl,
doc = "Rust Prost toolchain rule.",
fragments = ["proto"],
attrs = dict({
"include_transitive_deps": attr.bool(
doc = "Whether to include transitive dependencies. If set to True, all transitive dependencies will directly accessible by the dependent crate.",
default = False,
),
"prost_opts": attr.string_list(
doc = "Additional options to add to Prost.",
),
Expand Down
147 changes: 79 additions & 68 deletions proto/prost/private/protoc_wrapper.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,38 @@ struct Module {
contents: String,

/// The names of any other modules which are submodules of this module.
submodules: BTreeSet<String>,
submodules: BTreeMap<String, Module>,
}

impl Module {
fn insert(&mut self, module_name: String, contents: String) {
let module_parts = module_name.split('.').collect::<Vec<_>>();

self.insert_module(module_parts.as_slice(), contents);
}

fn insert_module(&mut self, module_parts: &[&str], contents: String) -> &mut Module {
let current_name = module_parts[0].to_string();

// Insert empty module if it doesn't exist.
self.submodules
.entry(current_name.clone())
.or_insert_with(|| Module {
name: current_name.clone(),
contents: "".to_string(),
submodules: BTreeMap::new(),
});

let current_module = self.submodules.get_mut(&current_name).unwrap();

// If this is the last part (current module) then add the contents.
if module_parts.len() == 1 {
current_module.contents = contents;
return current_module;
}

return current_module.insert_module(&module_parts[1..], contents);
}
}

/// Generate a lib.rs file with all prost/tonic outputs embeeded in modules which
Expand Down Expand Up @@ -117,8 +148,22 @@ struct Module {
/// }
/// }
/// ```
fn generate_lib_rs(prost_outputs: &BTreeSet<PathBuf>, is_tonic: bool) -> String {
let mut module_info = BTreeMap::new();
fn generate_lib_rs(
prost_outputs: &BTreeSet<PathBuf>,
is_tonic: bool,
direct_dep_crate_names: Vec<String>,
) -> String {
let mut contents = vec!["// @generated".to_string(), "".to_string()];
for crate_name in direct_dep_crate_names {
contents.push(format!("pub use {crate_name};"));
}
contents.push("".to_string());

let mut module_info = Module {
name: "".to_string(),
contents: contents.join("\n"),
submodules: BTreeMap::new(),
};

for path in prost_outputs.iter() {
let mut package = path
Expand All @@ -139,75 +184,29 @@ fn generate_lib_rs(prost_outputs: &BTreeSet<PathBuf>, is_tonic: bool) -> String
continue;
}

let name = if package == "_" {
package.clone()
} else if package.contains('.') {
package
.rsplit_once('.')
.expect("Failed to split on '.'")
.1
.to_snake_case()
.to_string()
} else {
package.to_snake_case()
};

// Avoid a stack overflow by skipping a known bad package name
let module_name = snake_cased_package_name(&package);

module_info.insert(
module_name.clone(),
Module {
name,
contents: fs::read_to_string(path).expect("Failed to read file"),
submodules: BTreeSet::new(),
},
);

let module_parts = module_name.split('.').collect::<Vec<_>>();
for parent_module_index in 0..module_parts.len() {
let child_module_index = parent_module_index + 1;
if child_module_index >= module_parts.len() {
break;
}
let full_parent_module_name = module_parts[0..parent_module_index + 1].join(".");
let parent_module_name = module_parts[parent_module_index];
let child_module_name = module_parts[child_module_index];

module_info
.entry(full_parent_module_name.clone())
.and_modify(|parent_module| {
parent_module
.submodules
.insert(child_module_name.to_string());
})
.or_insert(Module {
name: parent_module_name.to_string(),
contents: "".to_string(),
submodules: [child_module_name.to_string()].iter().cloned().collect(),
});
}
let contents = fs::read_to_string(path).expect("Failed to read file");
module_info.insert(module_name, contents);
}

let mut content = "// @generated\n\n".to_string();
write_module(&mut content, &module_info, "", 0);
let mut content = String::new();
write_module(&mut content, &module_info, 0);
content
}

/// Write out a rust module and all of its submodules.
fn write_module(
content: &mut String,
module_info: &BTreeMap<String, Module>,
module_name: &str,
depth: usize,
) {
if module_name.is_empty() {
for submodule_name in module_info.keys() {
write_module(content, module_info, submodule_name, depth + 1);
fn write_module(content: &mut String, module: &Module, depth: usize) {
if module.name.is_empty() {
content
.write_str(&module.contents)
.expect("Failed to write string");
for submodule in module.submodules.values() {
write_module(content, submodule, depth);
}
return;
}
let module = module_info.get(module_name).expect("Failed to get module");
let indent = " ".repeat(depth);
let is_rust_module = module.name != "_";

Expand All @@ -222,13 +221,8 @@ fn write_module(
.write_str(&module.contents)
.expect("Failed to write string");

for submodule_name in module.submodules.iter() {
write_module(
content,
module_info,
[module_name, submodule_name].join(".").as_str(),
depth + 1,
);
for submodule in module.submodules.values() {
write_module(content, submodule, depth + 1);
}

if is_rust_module {
Expand Down Expand Up @@ -439,6 +433,9 @@ struct Args {
/// The proto include paths.
proto_paths: Vec<String>,

/// Direct dependency crate names.
direct_dep_crate_names: Vec<String>,

/// The path to the rustfmt binary.
rustfmt: Option<PathBuf>,

Expand All @@ -464,6 +461,7 @@ impl Args {
let mut proto_paths = Vec::new();
let mut label: Option<String> = None;
let mut tonic_or_prost_opts = Vec::new();
let mut direct_dep_crate_names = Vec::new();
let mut is_tonic = false;

let mut extra_args = Vec::new();
Expand Down Expand Up @@ -523,6 +521,13 @@ impl Args {
}
}
}
("--direct_dep_crate_names", value) => {
if value.trim().is_empty() {
return;
}

direct_dep_crate_names = value.split(',').map(|s| s.to_string()).collect();
}
("--descriptor_set", value) => {
descriptor_set = Some(PathBuf::from(value));
}
Expand Down Expand Up @@ -614,6 +619,7 @@ impl Args {
out_librs: out_librs.unwrap(),
rustfmt,
proto_paths,
direct_dep_crate_names,
is_tonic,
label: label.unwrap(),
extra_args,
Expand Down Expand Up @@ -719,6 +725,7 @@ fn main() {
out_librs,
rustfmt,
proto_paths,
direct_dep_crate_names,
is_tonic,
extra_args,
} = Args::parse().expect("Failed to parse args");
Expand Down Expand Up @@ -832,7 +839,11 @@ fn main() {
.expect("Failed to compute proto package info");

// Write outputs
fs::write(&out_librs, generate_lib_rs(&rust_files, is_tonic)).expect("Failed to write file.");
fs::write(
&out_librs,
generate_lib_rs(&rust_files, is_tonic, direct_dep_crate_names),
)
.expect("Failed to write file.");
fs::write(
package_info_file,
extern_paths
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//! Tests package importing with the same package name.

use package_import_proto::package::import::A;
use package_importer_proto::package::import::B;
use package_importer_proto::package_import_proto::package::import::A;

#[test]
fn test_package_importer() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

use bar_proto::b_ar::b_az::qaz::qu_x::bar::Baz as BazMessage;
use bar_proto::b_ar::b_az::qaz::qu_x::Bar as BarMessage;
use foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::foo::NestedFoo as NestedFooMessage;
use foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::Foo as FooMessage;
use bar_proto::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::foo::NestedFoo as NestedFooMessage;
use bar_proto::foo_proto::foo::quu_x::co_rg_e::grault::ga_rply::Foo as FooMessage;

#[test]
fn test_packages() {
Expand Down
Loading

0 comments on commit 5d8d989

Please sign in to comment.