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}