123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- extern crate glob;
- use std::{
- env, fs,
- ops::Deref,
- path::{Path, PathBuf},
- };
- fn out_dir() -> PathBuf {
- Path::new(&env::var("OUT_DIR").expect("env")).to_path_buf()
- }
- fn cleanup() {
- let _ = fs::remove_dir_all(&out_dir());
- }
- fn compile() {
- let proto_dir = Path::new(&env::var("CARGO_MANIFEST_DIR").expect("env")).join("proto");
- let files = &[
- proto_dir.join("authentication.proto"),
- proto_dir.join("keyexchange.proto"),
- proto_dir.join("mercury.proto"),
- proto_dir.join("metadata.proto"),
- proto_dir.join("playlist4changes.proto"),
- proto_dir.join("playlist4content.proto"),
- proto_dir.join("playlist4issues.proto"),
- proto_dir.join("playlist4meta.proto"),
- proto_dir.join("playlist4ops.proto"),
- proto_dir.join("pubsub.proto"),
- proto_dir.join("spirc.proto"),
- ];
- let slices = files.iter().map(Deref::deref).collect::<Vec<_>>();
- let out_dir = out_dir();
- fs::create_dir(&out_dir).expect("create_dir");
- protobuf_codegen_pure::Codegen::new()
- .out_dir(&out_dir)
- .inputs(&slices)
- .include(&proto_dir)
- .run()
- .expect("Codegen failed.");
- }
- fn generate_mod_rs() {
- let out_dir = out_dir();
- let mods = glob::glob(&out_dir.join("*.rs").to_string_lossy())
- .expect("glob")
- .filter_map(|p| {
- p.ok()
- .map(|p| format!("pub mod {};", p.file_stem().unwrap().to_string_lossy()))
- })
- .collect::<Vec<_>>()
- .join("\n");
- let mod_rs = out_dir.join("mod.rs");
- fs::write(&mod_rs, format!("// @generated\n{}\n", mods)).expect("write");
- println!("cargo:rustc-env=PROTO_MOD_RS={}", mod_rs.to_string_lossy());
- }
- fn main() {
- cleanup();
- compile();
- generate_mod_rs();
- }
|