type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
mod build_attestation_paths;
fn main() -> Result<()> {
println!("cargo:rerun-if-changed=proto/arborter.proto");
println!("cargo:rerun-if-changed=proto/arborter_auth.proto");
println!("cargo:rerun-if-changed=proto/arborter_config.proto");
println!("cargo:rerun-if-changed=proto/attestation.proto");
println!("cargo:rerun-if-env-changed=DOCS_RS");
println!("cargo:rerun-if-env-changed=ASPENS_REGEN_PROTOS");
let force = std::env::var_os("ASPENS_REGEN_PROTOS").is_some();
if (!force && generated_present()) || std::env::var_os("DOCS_RS").is_some() {
return Ok(());
}
build_protos()?;
Ok(())
}
fn generated_present() -> bool {
use std::path::Path;
const GENERATED: [&str; 4] = [
"xyz.aspens.arborter.v1.rs",
"xyz.aspens.arborter_auth.v1.rs",
"xyz.aspens.arborter_config.v1.rs",
"xyz.aspens.attestation.v1.rs",
];
GENERATED
.iter()
.all(|f| Path::new("proto/generated").join(f).exists())
}
fn build_protos() -> Result<()> {
tonic_prost_build::configure()
.protoc_arg("--experimental_allow_proto3_optional")
.build_server(false)
.build_client(true)
.out_dir("proto/generated")
.compile_protos(&["proto/arborter.proto"], &["proto"])?;
tonic_prost_build::configure()
.protoc_arg("--experimental_allow_proto3_optional")
.build_server(false)
.build_client(true)
.out_dir("proto/generated")
.type_attribute(
"xyz.aspens.arborter_auth.v1.AuthRequest",
"#[derive(serde::Serialize, serde::Deserialize)]",
)
.type_attribute(
"xyz.aspens.arborter_auth.v1.AuthResponse",
"#[derive(serde::Serialize, serde::Deserialize)]",
)
.type_attribute(
"xyz.aspens.arborter_auth.v1.InitializeAdminRequest",
"#[derive(serde::Serialize, serde::Deserialize)]",
)
.type_attribute(
"xyz.aspens.arborter_auth.v1.InitializeAdminResponse",
"#[derive(serde::Serialize, serde::Deserialize)]",
)
.compile_protos(&["proto/arborter_auth.proto"], &["proto"])?;
tonic_prost_build::configure()
.protoc_arg("--experimental_allow_proto3_optional")
.build_server(false)
.build_client(true)
.out_dir("proto/generated")
.type_attribute(
"xyz.aspens.arborter_config.v1.Configuration",
"#[derive(serde::Serialize, serde::Deserialize)] #[serde(rename_all = \"camelCase\")]",
)
.type_attribute(
"xyz.aspens.arborter_config.v1.Chain",
"#[derive(serde::Serialize, serde::Deserialize)] #[serde(rename_all = \"camelCase\")]",
)
.type_attribute(
"xyz.aspens.arborter_config.v1.Market",
"#[derive(serde::Serialize, serde::Deserialize)] #[serde(rename_all = \"camelCase\")]",
)
.type_attribute(
"xyz.aspens.arborter_config.v1.Token",
"#[derive(serde::Serialize, serde::Deserialize)] #[serde(rename_all = \"camelCase\")]",
)
.type_attribute(
"xyz.aspens.arborter_config.v1.TradeContract",
"#[derive(serde::Serialize, serde::Deserialize)] #[serde(rename_all = \"camelCase\")]",
)
.type_attribute(
"xyz.aspens.arborter_config.v1.GetConfigResponse",
"#[derive(serde::Serialize, serde::Deserialize)] #[serde(rename_all = \"camelCase\")]",
)
.type_attribute(
"xyz.aspens.arborter_config.v1.GetConfigRequest",
"#[derive(serde::Serialize, serde::Deserialize)] #[serde(rename_all = \"camelCase\")]",
)
.compile_protos(&["proto/arborter_config.proto"], &["proto"])?;
fix_attestation_paths()?;
Ok(())
}
fn fix_attestation_paths() -> Result<()> {
use std::fs;
let config_file = "proto/generated/xyz.aspens.arborter_config.v1.rs";
let content = fs::read_to_string(config_file)?;
let fixed_content = build_attestation_paths::rewrite_attestation_paths(&content);
fs::write(config_file, fixed_content)?;
Ok(())
}