mod eval;
mod master;
mod worker;
use std::{env, path::PathBuf};
use anyhow::Result;
use clap::{ArgGroup, Parser};
pub const WORKER_ENV: &str = "_NEJ_WORKER";
#[derive(Parser, Clone)]
#[command(name = "evix", about = "Evaluate a Nix attrset and emit one JSON line per derivation")]
#[command(group(ArgGroup::new("input").required(true).args(["flake", "expr", "file"])))]
pub struct Args {
#[arg(long)]
pub flake: Option<String>,
#[arg(long)]
pub expr: Option<String>,
#[arg(long)]
pub file: Option<PathBuf>,
#[arg(long = "arg", value_names = ["NAME", "EXPR"], num_args = 2, action = clap::ArgAction::Append)]
pub arg: Vec<String>,
#[arg(long = "argstr", value_names = ["NAME", "VALUE"], num_args = 2, action = clap::ArgAction::Append)]
pub argstr: Vec<String>,
#[arg(long, default_value_t = 1)]
pub workers: usize,
#[arg(long, default_value_t = 4096)]
pub max_memory_size: usize,
#[arg(long)]
pub force_recurse: bool,
#[arg(long)]
pub gc_roots_dir: Option<PathBuf>,
}
fn main() -> Result<()> {
let args = Args::parse();
if env::var(WORKER_ENV).is_ok() {
worker::run_worker(&args)
} else {
master::run_master(&args)
}
}