darling_cargo/
lib.rs

1use darling_api as darling;
2
3pub struct Cargo;
4
5pub static PACKAGE_MANAGER: Cargo = Cargo;
6
7impl darling::PackageManager for Cargo {
8    fn name(&self) -> String {
9        "cargo".to_owned()
10    }
11
12    fn install(&self, _context: &darling::Context, package: &darling::InstallationEntry) -> anyhow::Result<()> {
13        std::process::Command::new("cargo").arg("install").arg(&package.name).spawn()?.wait()?;
14        Ok(())
15    }
16
17    fn uninstall(&self, _context: &darling::Context, package: &darling::InstallationEntry) -> anyhow::Result<()> {
18        std::process::Command::new("cargo").arg("uninstall").arg(&package.name).spawn()?.wait()?;
19        Ok(())
20    }
21
22    fn get_all_explicit(&self, _context: &darling::Context) -> anyhow::Result<Vec<(String, String)>> {
23        let output = String::from_utf8(std::process::Command::new("cargo").arg("install").arg("--list").output()?.stdout)?;
24        let installed_crates = output.lines().filter(|line| !line.chars().all(|char| char.is_whitespace()));
25        let pattern = regex_macro::regex!(r"^(\S+)\s([^:]+)");
26        let crates = installed_crates
27            .filter_map(|entry| pattern.captures(entry).map(|capt| (capt[1].to_owned(), capt[2].to_owned())))
28            .collect::<Vec<_>>();
29
30        Ok(crates)
31    }
32}