use std::path::PathBuf;
use clap::Parser;
use tvix_store::utils::ServiceUrlsMemory;
#[derive(Parser, Clone)]
pub struct Args {
pub script: Option<PathBuf>,
#[clap(long, short = 'E')]
pub expr: Option<String>,
#[clap(long, env = "TVIX_DISPLAY_AST")]
pub display_ast: bool,
#[clap(long, env = "TVIX_DUMP_BYTECODE")]
pub dump_bytecode: bool,
#[clap(long, env = "TVIX_TRACE_RUNTIME")]
pub trace_runtime: bool,
#[clap(long, env = "TVIX_TRACE_RUNTIME_TIMING", requires("trace_runtime"))]
pub trace_runtime_timing: bool,
#[clap(long)]
pub compile_only: bool,
#[clap(long)]
pub no_warnings: bool,
#[clap(long = "extra-nix-path", short = 'I', action = clap::ArgAction::Append)]
pub extra_nix_paths: Option<Vec<String>>,
#[clap(long)]
pub raw: bool,
#[clap(long)]
pub strict: bool,
#[clap(flatten)]
pub service_addrs: ServiceUrlsMemory,
#[arg(long, env, default_value = "dummy://")]
pub build_service_addr: String,
#[clap(long)]
pub drv_dumpdir: Option<PathBuf>,
}
impl Args {
pub fn nix_path(&self) -> Option<String> {
resolve_nix_path(std::env::var("NIX_PATH"), &self.extra_nix_paths)
}
}
fn resolve_nix_path(
nix_path: Result<String, std::env::VarError>,
extra_nix_paths: &Option<Vec<String>>,
) -> Option<String> {
let nix_path_option = nix_path.ok().filter(|string| !string.is_empty());
let extra_nix_paths_option = extra_nix_paths.to_owned().map(|vec| vec.join(":"));
match (nix_path_option, extra_nix_paths_option) {
(Some(nix_path), Some(mut extra_nix_paths)) => {
extra_nix_paths.push(':');
Some(extra_nix_paths + &nix_path)
}
(nix_path_option, extra_nix_paths_option) => nix_path_option.or(extra_nix_paths_option),
}
}
#[cfg(test)]
mod tests {
use super::resolve_nix_path;
#[test]
fn test_resolve_nix_path() {
let nix_path = Ok("/nixpath1:nixpath2=/nixpath2".to_owned());
let extra_nix_paths = Some(vec!["/extra1".to_owned(), "extra2=/extra2".to_owned()]);
let expected = Some("/extra1:extra2=/extra2:/nixpath1:nixpath2=/nixpath2".to_owned());
let actual = resolve_nix_path(nix_path, &extra_nix_paths);
assert!(actual == expected);
let nix_path = Err(std::env::VarError::NotPresent);
let extra_nix_paths = Some(vec!["/extra1".to_owned(), "extra2=/extra2".to_owned()]);
let expected = Some("/extra1:extra2=/extra2".to_owned());
let actual = resolve_nix_path(nix_path, &extra_nix_paths);
assert!(actual == expected);
let nix_path = Ok("/nixpath1:nixpath2=/nixpath2".to_owned());
let extra_nix_paths = None;
let expected = Some("/nixpath1:nixpath2=/nixpath2".to_owned());
let actual = resolve_nix_path(nix_path, &extra_nix_paths);
assert!(actual == expected);
let nix_path = Err(std::env::VarError::NotPresent);
let extra_nix_paths = None;
let expected = None;
let actual = resolve_nix_path(nix_path, &extra_nix_paths);
assert!(actual == expected);
}
}