dyns 0.7.2

DNS discovery and resolver support for DHTTP applications
Documentation
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")
        );
    }
}