Skip to content

Commit 443f571

Browse files
Walk proto dir instead of manually specifying needed files
1 parent a9b08a1 commit 443f571

File tree

3 files changed

+75
-8
lines changed

3 files changed

+75
-8
lines changed

Cargo.lock

+29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/proto/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ prost = "0.13"
99

1010
[build-dependencies]
1111
tonic-build = "0.12"
12+
walkdir = "2.5"
1213

1314
[lib]
1415
path = "lib.rs"

lib/proto/build.rs

+45-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
use std::path::Path;
1+
use std::{
2+
ffi::OsStr,
3+
path::{Component, Path, PathBuf},
4+
};
5+
use walkdir::WalkDir;
26

37
fn main() -> Result<(), Box<dyn std::error::Error>> {
48
let workspace_dir = Path::new(env!("CARGO_WORKSPACE_DIR"));
@@ -8,13 +12,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
812
let proto_file_descriptor_set_path = Path::new("generated/bin/descriptor.bin");
913
let generated_include_file = Path::new("include.rs");
1014

11-
let v1_protos = [
12-
proto_tuxtape_dir.join("server/database/v1/database.proto"),
13-
proto_tuxtape_dir.join("server/registrar/v1/registrar.proto"),
14-
proto_tuxtape_dir.join("server/fleet_client/v1/fleet_client.proto"),
15-
proto_tuxtape_dir.join("kernel_builder/v1/kernel_builder.proto"),
16-
proto_tuxtape_dir.join("patch_builder/v1/patch_builder.proto"),
17-
];
15+
let v1_protos = fetch_proto_dirs(&proto_tuxtape_dir, 1, vec!["common"])?;
1816

1917
let mut config = tonic_build::Config::default();
2018
config.out_dir(proto_src_out_dir);
@@ -29,3 +27,42 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
2927

3028
Ok(())
3129
}
30+
31+
fn fetch_proto_dirs(
32+
proto_package_dir: &Path,
33+
proto_version: usize,
34+
ignore_modules: Vec<&str>,
35+
) -> std::io::Result<Vec<PathBuf>> {
36+
let version_str = format!("v{proto_version}");
37+
38+
let ignore_components: Vec<_> = ignore_modules
39+
.iter()
40+
.map(|module| Component::Normal(OsStr::new(module)))
41+
.collect();
42+
43+
let proto_paths = WalkDir::new(proto_package_dir)
44+
.into_iter()
45+
.filter(|entry| {
46+
let entry = if let Ok(entry) = entry {
47+
entry
48+
} else {
49+
return false;
50+
};
51+
52+
entry.path().extension().is_some_and(|ext| ext == "proto")
53+
&& entry
54+
.path()
55+
.components()
56+
.any(|comp| comp == Component::Normal(OsStr::new(&version_str)))
57+
&& !entry
58+
.path()
59+
.components()
60+
.any(|comp| ignore_components.contains(&comp))
61+
})
62+
.collect::<Result<Vec<_>, _>>()?;
63+
64+
Ok(proto_paths
65+
.iter()
66+
.map(|entry| entry.path().to_path_buf())
67+
.collect::<Vec<PathBuf>>())
68+
}

0 commit comments

Comments
 (0)