use std::{
error::Error,
fs::File,
io::{copy, Read},
};
fn main() -> Result<(), Box<dyn Error>> {
if std::env::var_os("DOCS_RS").is_some() {
return Ok(());
}
let proto_url = "https://usage-reporting.api.apollographql.com/proto/reports.proto";
let response = reqwest::blocking::get(proto_url)?;
let mut content = 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/agents.proto", "proto/reports.proto"];
tonic_build::configure()
.type_attribute("ContextualizedStats", "#[derive(serde::Serialize)]")
.type_attribute("StatsContext", "#[derive(serde::Serialize)]")
.type_attribute("QueryLatencyStats", "#[derive(serde::Serialize)]")
.type_attribute("TypeStat", "#[derive(serde::Serialize)]")
.type_attribute("PathErrorStats", "#[derive(serde::Serialize)]")
.type_attribute("FieldStat", "#[derive(serde::Serialize)]")
.type_attribute("ReferencedFieldsForType", "#[derive(serde::Serialize)]")
.type_attribute("StatsContext", "#[derive(Eq, Hash)]")
.build_server(true)
.compile(&proto_files, &["."])?;
for file in proto_files {
println!("cargo:rerun-if-changed={}", file);
}
Ok(())
}