dyns 0.7.0

DNS discovery and resolver support for DHTTP applications
Documentation
use std::{env, fs, path::PathBuf};

const H3_DNS_SERVER_ENV: &str = "DHTTP_H3_DNS_SERVER";
const BOOTSTRAP_URL_ENV: &str = "DHTTP_BOOTSTRAP_URL";
const MDNS_SERVICE_ENV: &str = "DHTTP_MDNS_SERVICE";

const DEFAULT_H3_DNS_SERVER: &str = "https://ddns.genmeta.net:4433";
const DEFAULT_BOOTSTRAP_URL: &str = "https://bootstrap.genmeta.net:20002";
const DEFAULT_MDNS_SERVICE: &str = "_dhttp.local";

fn main() {
    let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR is set by cargo"));

    let h3_dns_server = env_or_default(H3_DNS_SERVER_ENV, DEFAULT_H3_DNS_SERVER);
    let bootstrap_url = env_or_default(BOOTSTRAP_URL_ENV, DEFAULT_BOOTSTRAP_URL);
    let mdns_service = env_or_default(MDNS_SERVICE_ENV, DEFAULT_MDNS_SERVICE);

    let bootstrap = format!(
        "// @generated by build.rs; do not edit.\n\
         pub const DHTTP_H3_DNS_SERVER: &str = {h3_dns_server:?};\n\
         pub const DHTTP_BOOTSTRAP_URL: &str = {bootstrap_url:?};\n\
         pub const DHTTP_MDNS_SERVICE: &str = {mdns_service:?};\n"
    );
    fs::write(out_dir.join("bootstrap.rs"), bootstrap)
        .expect("failed to write generated DHTTP DNS bootstrap constants");

    println!("cargo::rerun-if-env-changed={H3_DNS_SERVER_ENV}");
    println!("cargo::rerun-if-env-changed={BOOTSTRAP_URL_ENV}");
    println!("cargo::rerun-if-env-changed={MDNS_SERVICE_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_H3_DNS_SERVER),
            "https://ddns.genmeta.net:4433"
        );
        assert_eq!(
            env_or_default(&name, DEFAULT_BOOTSTRAP_URL),
            "https://bootstrap.genmeta.net:20002"
        );
        assert_eq!(env_or_default(&name, DEFAULT_MDNS_SERVICE), "_dhttp.local");
    }

    #[test]
    fn default_urls_use_expected_authorities() {
        assert_eq!(
            DEFAULT_H3_DNS_SERVER.strip_prefix("https://"),
            Some("ddns.genmeta.net:4433")
        );
        assert_eq!(
            DEFAULT_BOOTSTRAP_URL.strip_prefix("https://"),
            Some("bootstrap.genmeta.net:20002")
        );
    }
}