1#![doc = include_str!("../README.md")]
2
3use std::{fs, path::PathBuf};
4
5use protobuf::reflect::MessageDescriptor;
6use protobuf_codegen::{Codegen, Customize, CustomizeCallback};
7
8struct GenIgnMessage;
9
10impl CustomizeCallback for GenIgnMessage {
11 fn message(&self, _message: &MessageDescriptor) -> Customize {
12 Customize::default().before("#[derive(::gz_msgs_common::IgnMessage)]")
13 }
14}
15
16struct GenGzMessage;
17
18impl CustomizeCallback for GenGzMessage {
19 fn message(&self, _message: &MessageDescriptor) -> Customize {
20 Customize::default().before("#[derive(::gz_msgs_common::GzMessage)]")
21 }
22}
23
24pub fn build(branch: &str, is_ignition: bool) -> Result<(), Box<dyn std::error::Error>> {
25 let mut protos = vec![];
26
27 let proto_dir = PathBuf::new().join("3rdparty").join(branch).join("proto");
28 let dir = proto_dir
29 .join(if is_ignition { "ignition" } else { "gz" })
30 .join("msgs");
31
32 for entry in fs::read_dir(dir)? {
33 let path = entry?.path();
34 if path.is_file() && path.extension() == Some("proto".as_ref()) {
35 let path_str = path.to_str().unwrap();
36 println!("cargo:rerun-if-changed={}", path_str);
37 protos.push(path);
38 }
39 }
40
41 let mut codegen = Codegen::new();
42
43 if is_ignition {
44 codegen.customize_callback(GenIgnMessage)
45 } else {
46 codegen.customize_callback(GenGzMessage)
47 };
48
49 let out_dir = PathBuf::new().join("src").join(branch.replace('-', "_"));
50 let _ = fs::create_dir(&out_dir);
51
52 codegen
53 .out_dir(&out_dir)
54 .inputs(&protos)
55 .include(&proto_dir)
56 .run()?;
57
58 Ok(())
59}