zoi-cli 1.25.3

Advanced Package Manager & Environment Orchestrator
Documentation
//! Build script for zoi-cli.
//!
//! This script passes necessary environment variables, such as default registry
//! URLs and commit hashes, to the compiler so they can be embedded in the CLI
//! binary.

use std::env;
use std::path::Path;

/// Environment variables that should trigger a rebuild if changed.
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"
];
/// The default Git registry URL used if none is specified in the environment.
const DEFAULT_REGISTRY: &str =
    "https://gitlab.com/zillowe/zillwen/zusty/zoidberg.git";
/// The range of indices used for built-in authority environment variables.
const AUTHORITIES_KEY_RANGE: std::ops::Range<usize> = 1..10;

/// Forwards an environment variable from the build environment to the `rustc`
/// compiler.
fn forward_env_var(var: &str) {
    if let Ok(val) = env::var(var) {
        println!("cargo:rustc-env={var}={val}");
    }
}

fn main() {
    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(",")
    );
}