use std::{env, fs, path::PathBuf};
const NAME_SERVICE_ENV: &str = "DHTTP_NAME_SERVICE";
const BOOTSTRAP_URL_ENV: &str = "DHTTP_BOOTSTRAP_URL";
const MDNS_SERVICE_DOMAIN_ENV: &str = "DHTTP_MDNS_SERVICE_DOMAIN";
const DEFAULT_NAME_SERVICE: &str = "https://ddns.genmeta.net";
const DEFAULT_BOOTSTRAP_URL: &str = "https://bootstrap.genmeta.net:20002";
const DEFAULT_MDNS_SERVICE_DOMAIN: &str = "_dhttp.local";
fn main() {
let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR is set by cargo"));
let name_service = env_or_default(NAME_SERVICE_ENV, DEFAULT_NAME_SERVICE);
let bootstrap_url = env_or_default(BOOTSTRAP_URL_ENV, DEFAULT_BOOTSTRAP_URL);
let mdns_service_domain = env_or_default(MDNS_SERVICE_DOMAIN_ENV, DEFAULT_MDNS_SERVICE_DOMAIN);
let bootstrap = format!(
"// @generated by build.rs; do not edit.\n\
pub const DHTTP_NAME_SERVICE: &str = {name_service:?};\n\
pub const DHTTP_BOOTSTRAP_URL: &str = {bootstrap_url:?};\n\
pub const DHTTP_MDNS_SERVICE_DOMAIN: &str = {mdns_service_domain:?};\n"
);
fs::write(out_dir.join("bootstrap.rs"), bootstrap)
.expect("failed to write generated DHTTP DNS bootstrap constants");
println!("cargo::rerun-if-env-changed={NAME_SERVICE_ENV}");
println!("cargo::rerun-if-env-changed={BOOTSTRAP_URL_ENV}");
println!("cargo::rerun-if-env-changed={MDNS_SERVICE_DOMAIN_ENV}");
}
fn env_or_default(name: &str, default: &str) -> String {
env::var(name).unwrap_or_else(|_| default.to_owned())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn missing_env_uses_genmeta_production_defaults() {
let name = format!("__DDNS_MISSING_BOOTSTRAP_{}", std::process::id());
assert_eq!(
env_or_default(&name, DEFAULT_NAME_SERVICE),
"https://ddns.genmeta.net"
);
assert_eq!(
env_or_default(&name, DEFAULT_BOOTSTRAP_URL),
"https://bootstrap.genmeta.net:20002"
);
assert_eq!(
env_or_default(&name, DEFAULT_MDNS_SERVICE_DOMAIN),
"_dhttp.local"
);
}
#[test]
fn default_urls_use_expected_authorities() {
assert_eq!(
DEFAULT_NAME_SERVICE.strip_prefix("https://"),
Some("ddns.genmeta.net")
);
assert_eq!(
DEFAULT_BOOTSTRAP_URL.strip_prefix("https://"),
Some("bootstrap.genmeta.net:20002")
);
}
}