tmpltool 1.5.0

A fast and simple command-line template rendering tool using MiniJinja templates with environment variables
Documentation
use clap::Parser;
use serde::Serialize;
use std::path::Path;
use std::process;
use tmpltool::cli::IdeFormat;
use tmpltool::{Cli, FunctionMetadata, get_all_metadata, render_template};

/// Wrapper for TOML output (TOML requires a table at the root)
#[derive(Serialize)]
struct IdeMetadata<'a> {
    functions: Vec<&'a FunctionMetadata>,
}

/// Load environment variables from .env files
/// Later files override variables from earlier files
fn load_env_files(env_files: &[String]) -> Result<(), String> {
    if env_files.is_empty() {
        return Ok(());
    }
    for env_file in env_files {
        let path = Path::new(env_file);
        if !path.exists() {
            return Err(format!("Environment file not found: {}", env_file));
        }
        // Use from_path_override to allow later files to override earlier ones
        dotenvy::from_path_override(path)
            .map_err(|e| format!("Failed to load '{}': {}", env_file, e))?;
    }
    Ok(())
}

fn main() {
    let cli = Cli::parse();

    // Load environment files first (before any other processing)
    if let Err(e) = load_env_files(&cli.env_files) {
        eprintln!("Error: {}", e);
        process::exit(1);
    }

    // Handle --ide <format> early exit
    if let Some(format) = cli.ide {
        let metadata = get_all_metadata();
        let result = match format {
            IdeFormat::Json => serde_json::to_string_pretty(&metadata).map_err(|e| e.to_string()),
            IdeFormat::Yaml => serde_yaml::to_string(&metadata).map_err(|e| e.to_string()),
            IdeFormat::Toml => {
                let wrapped = IdeMetadata {
                    functions: metadata,
                };
                toml::to_string_pretty(&wrapped).map_err(|e| e.to_string())
            }
        };
        match result {
            Ok(data) => {
                println!("{}", data);
                process::exit(0);
            }
            Err(e) => {
                eprintln!("Error serializing metadata: {}", e);
                process::exit(1);
            }
        }
    }

    if let Err(e) = render_template(
        cli.template.as_deref(),
        cli.output.as_deref(),
        cli.trust,
        cli.validate,
    ) {
        eprintln!("Error: {}", e);
        process::exit(1);
    }
}