cargo-leptos 0.1.0

Build tool for Leptos.
use super::ProjectConfig;
use crate::{ext::anyhow::Result, logger::GRAY};
use camino::{Utf8Path, Utf8PathBuf};
use std::fs;

pub fn find_env_file(directory: &Utf8Path) -> Option<Utf8PathBuf> {
    let candidate = directory.join(".env");

    if let Ok(metadata) = fs::metadata(&candidate) {
        if metadata.is_file() {
            return Some(candidate);
        }
    }

    if let Some(parent) = directory.parent() {
        find_env_file(parent)
    } else {
        None
    }
}

pub fn overlay_env(conf: &mut ProjectConfig, file: &Utf8Path) -> Result<()> {
    for entry in dotenvy::from_path_iter(file)? {
        let (key, val) = entry?;

        match key.as_str() {
            "OUTPUT_NAME" => conf.output_name = val,
            "LEPTOS_SITE_ROOT" => conf.site_root = Utf8PathBuf::from(val),
            "LEPTOS_SITE_PKG_DIR" => conf.site_pkg_dir = Utf8PathBuf::from(val),
            "LEPTOS_STYLE_FILE" => conf.style_file = Some(Utf8PathBuf::from(val)),
            "LEPTOS_ASSETS_DIR" => conf.assets_dir = Some(Utf8PathBuf::from(val)),
            "LEPTOS_SITE_ADDR" => conf.site_addr = val.parse()?,
            "LEPTOS_RELOAD_PORT" => conf.reload_port = val.parse()?,
            "LEPTOS_END2END_CMD" => conf.end2end_cmd = Some(val),
            "LEPTOS_END2END_DIR" => conf.end2end_dir = Some(Utf8PathBuf::from(val)),
            "LEPTOS_BROWSERQUERY" => conf.browserquery = val,
            _ if key.starts_with("LEPTOS_") => {
                log::warn!(
                    "Env {key} is not used by cargo-leptos {}",
                    GRAY.paint(file.as_str())
                )
            }
            _ => log::debug!(
                r#"Env unused param "{key} = {val}" {}"#,
                GRAY.paint(file.as_str())
            ),
        }
    }
    Ok(())
}