csv_managed/
install.rs

1use std::{env, process::Command};
2
3use anyhow::{Context, Result, anyhow};
4use log::info;
5
6use crate::cli::InstallArgs;
7
8pub fn execute(args: &InstallArgs) -> Result<()> {
9    info!("Installing csv-managed via cargo install");
10    let shim = env::var_os("CSV_MANAGED_CARGO_SHIM");
11    let mut command = match shim {
12        Some(path) if !path.is_empty() => Command::new(path),
13        _ => Command::new("cargo"),
14    };
15    if let Ok(extra) = env::var("CSV_MANAGED_CARGO_SHIM_ARGS") {
16        for arg in extra.split('\n').filter(|segment| !segment.is_empty()) {
17            command.arg(arg);
18        }
19    }
20    command.arg("install").arg("csv-managed");
21
22    if let Some(version) = &args.version {
23        command.arg("--version").arg(version);
24    }
25    if args.force {
26        command.arg("--force");
27    }
28    if args.locked {
29        command.arg("--locked");
30    }
31    if let Some(root) = &args.root {
32        command.arg("--root").arg(root);
33    }
34
35    let status = command
36        .status()
37        .with_context(|| "Failed to spawn `cargo install` command")?;
38    if !status.success() {
39        return Err(anyhow!(
40            "`cargo install csv-managed` exited with status {status}"
41        ));
42    }
43    info!("csv-managed installed successfully");
44    Ok(())
45}