1
- use std:: path:: Path ;
1
+ use std:: {
2
+ ffi:: OsStr ,
3
+ path:: { Component , Path , PathBuf } ,
4
+ } ;
5
+ use walkdir:: WalkDir ;
2
6
3
7
fn main ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
4
8
let workspace_dir = Path :: new ( env ! ( "CARGO_WORKSPACE_DIR" ) ) ;
@@ -8,13 +12,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
8
12
let proto_file_descriptor_set_path = Path :: new ( "generated/bin/descriptor.bin" ) ;
9
13
let generated_include_file = Path :: new ( "include.rs" ) ;
10
14
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" ] ) ?;
18
16
19
17
let mut config = tonic_build:: Config :: default ( ) ;
20
18
config. out_dir ( proto_src_out_dir) ;
@@ -29,3 +27,42 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
29
27
30
28
Ok ( ( ) )
31
29
}
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