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}