zoi-cli 1.24.4

Advanced Package Manager & Environment Orchestrator
Documentation
use std::env;
use std::error::Error;
use std::path::Path;

const BUILD_ENV_VARS: &[&str] = &[
    "ZOI_COMMIT_HASH",
    "POSTHOG_API_KEY",
    "POSTHOG_API_HOST",
    "ZOI_ABOUT_PACKAGER_AUTHOR",
    "ZOI_ABOUT_PACKAGER_EMAIL",
    "ZOI_ABOUT_PACKAGER_HOMEPAGE",
    "ZOI_DEFAULT_REGISTRY",
];
const DEFAULT_REGISTRY: &str = "https://gitlab.com/zillowe/zillwen/zusty/zoidberg.git";
const AUTHORITIES_KEY_RANGE: std::ops::Range<usize> = 1..10;

fn forward_env_var(var: &str) {
    if let Ok(val) = env::var(var) {
        println!("cargo:rustc-env={var}={val}");
    }
}

fn main() -> Result<(), Box<dyn Error>> {
    for var in BUILD_ENV_VARS {
        println!("cargo:rerun-if-env-changed={var}");
    }
    for i in AUTHORITIES_KEY_RANGE {
        println!("cargo:rerun-if-env-changed=ZOI_AUTHORITIES_KEY_{i}");
    }

    let env_path = if Path::new(".env").exists() {
        Some(".env")
    } else if Path::new(".env.local").exists() {
        Some(".env.local")
    } else {
        None
    };

    if let Some(path) = env_path {
        println!("cargo:rerun-if-changed={path}");
        if dotenvy::from_filename(path).is_err() {
            println!("cargo:warning=failed to load env file: {path}");
        }
    }

    for var in BUILD_ENV_VARS
        .iter()
        .copied()
        .filter(|var| *var != "ZOI_DEFAULT_REGISTRY")
    {
        forward_env_var(var);
    }

    let zoi_registry = env::var("ZOI_DEFAULT_REGISTRY").unwrap_or_else(|_| DEFAULT_REGISTRY.into());
    println!("cargo:rustc-env=ZOI_DEFAULT_REGISTRY={zoi_registry}");

    let mut authorities = Vec::new();
    for i in AUTHORITIES_KEY_RANGE {
        if let Ok(val) = env::var(format!("ZOI_AUTHORITIES_KEY_{i}"))
            && !val.is_empty()
        {
            authorities.push(val);
        }
    }
    println!(
        "cargo:rustc-env=ZOI_BUILTIN_AUTHORITIES={}",
        authorities.join(",")
    );

    Ok(())
}