use protobuf_codegen::Customize;
use std::io::Write;
use std::path::Path;
use std::{
error::Error,
fs::File,
io::{copy, Read},
};
fn main() -> Result<(), Box<dyn Error>> {
if std::env::var_os("DOCS_RS").is_some() {
} else {
let proto_url = "https://usage-reporting.api.apollographql.com/proto/reports.proto";
let fut = reqwest::get(proto_url);
cfg_if::cfg_if! {
if #[cfg(not(target_arch = "wasm32"))] {
let rt = tokio::runtime::Runtime::new().unwrap();
let response = rt.block_on(fut)?;
let mut content = rt.block_on(response.text())?;
} else {
let response = async_std::task::block_on(fut)?;
let mut content = async_std::task::block_on(response.text())?;
}
}
let message = "\nmessage";
let msg_index = content.find(message).ok_or("cannot find message string")?;
content.insert_str(msg_index, "\npackage Report;\n");
content = content.replace("[(js_use_toArray) = true]", "");
content = content.replace("[(js_preEncoded) = true]", "");
let write_content = match File::open("proto/reports.proto") {
Ok(mut existing) => {
let mut existing_content = String::new();
existing.read_to_string(&mut existing_content)?;
content != existing_content
}
Err(_) => true,
};
if write_content {
let mut dest = File::create("proto/reports.proto")?;
copy(&mut content.as_bytes(), &mut dest)?;
}
}
let proto_files = vec!["proto/reports.proto"];
protobuf_codegen::Codegen::new()
.pure()
.cargo_out_dir("proto")
.inputs(&proto_files)
.include(".")
.customize(Customize::default().gen_mod_rs(false))
.run_from_script();
let out_dir = std::env::var("OUT_DIR")?;
let path = Path::new(&out_dir).join("proto").join("reports.rs");
let content = std::fs::read_to_string(&path)?;
let content = content
.lines()
.filter(|line| !(line.contains("#![") || line.contains("//!")))
.fold(String::new(), |mut content, line| {
content.push_str(line);
content.push('\n');
content
});
std::fs::remove_file(&path)?;
let mut file = std::fs::File::create(&path)?;
file.write_all(content.as_bytes())?;
for file in proto_files {
println!("cargo:rerun-if-changed={}", file);
}
Ok(())
}