gz_msgs_build/
lib.rs

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}