mod envfile;
mod remote;
mod schema;
mod secrets;
mod commands;
use clap::{Parser, Subcommand};
use clap_complete::Shell;
#[derive(Parser, Debug)]
#[command(name="zenv", version, about="Validate .env files with a schema and generate docs.")]
struct Cli {
#[command(subcommand)]
command: Command,
}
#[derive(Subcommand, Debug)]
enum Command {
Check {
#[arg(long, default_value = ".env")]
env: String,
#[arg(long, default_value = "env.schema.json")]
schema: String,
#[arg(long, default_value_t = true)]
allow_missing_env: bool,
#[arg(long, default_value_t = false)]
detect_secrets: bool,
#[arg(long, default_value_t = false)]
no_cache: bool,
#[arg(long, default_value_t = false)]
watch: bool,
},
Docs {
#[arg(long, default_value = "env.schema.json")]
schema: String,
#[arg(long, default_value = "markdown")]
format: String,
#[arg(long, default_value_t = false)]
no_cache: bool,
},
Init {
#[arg(long, default_value = ".env.example")]
example: String,
#[arg(long, default_value = "env.schema.json")]
schema: String,
},
Version {
#[arg(long, default_value_t = false)]
check_update: bool,
},
Completions {
#[arg(value_enum)]
shell: Shell,
},
Example {
#[arg(long, default_value = "env.schema.json")]
schema: String,
#[arg(long)]
output: Option<String>,
#[arg(long, default_value_t = false)]
include_defaults: bool,
#[arg(long, default_value_t = false)]
no_cache: bool,
},
Diff {
env_a: String,
env_b: String,
#[arg(long)]
schema: Option<String>,
#[arg(long, default_value = "text")]
format: String,
#[arg(long, default_value_t = false)]
no_cache: bool,
},
}
fn main() {
let cli = Cli::parse();
let result = match cli.command {
Command::Check { env, schema, allow_missing_env, detect_secrets, no_cache, watch } => {
commands::check::run(&env, &schema, allow_missing_env, detect_secrets, no_cache, watch)
}
Command::Docs { schema, format, no_cache } => commands::docs::run(&schema, &format, no_cache),
Command::Init { example, schema } => commands::init::run(&example, &schema),
Command::Version { check_update } => commands::version::run(check_update),
Command::Completions { shell } => commands::completions::run(shell),
Command::Example { schema, output, include_defaults, no_cache } => {
commands::example::run(&schema, output.as_deref(), include_defaults, no_cache)
}
Command::Diff { env_a, env_b, schema, format, no_cache } => {
commands::diff::run(&env_a, &env_b, schema.as_deref(), &format, no_cache)
}
};
if let Err(e) = result {
eprintln!("zenv error: {e}");
std::process::exit(1);
}
}