Skip to main content

trycmd/
registry.rs

1#[derive(Clone, Debug)]
2pub(crate) struct BinRegistry {
3    bins: std::collections::BTreeMap<String, crate::schema::Bin>,
4    fallback: bool,
5}
6
7impl BinRegistry {
8    pub(crate) fn new() -> Self {
9        Self {
10            bins: Default::default(),
11            fallback: true,
12        }
13    }
14
15    pub(crate) fn register_bin(&mut self, name: String, bin: crate::schema::Bin) {
16        self.bins.insert(name, bin);
17    }
18
19    pub(crate) fn register_bins(
20        &mut self,
21        bins: impl Iterator<Item = (String, crate::schema::Bin)>,
22    ) {
23        self.bins.extend(bins);
24    }
25
26    pub(crate) fn resolve_bin(
27        &self,
28        bin: crate::schema::Bin,
29    ) -> Result<crate::schema::Bin, crate::Error> {
30        match bin {
31            crate::schema::Bin::Path(path) => {
32                let bin = crate::schema::Bin::Path(path);
33                Ok(bin)
34            }
35            crate::schema::Bin::Name(name) => {
36                let bin = self.resolve_name(&name);
37                Ok(bin)
38            }
39            crate::schema::Bin::Ignore => Ok(crate::schema::Bin::Ignore),
40            crate::schema::Bin::Error(err) => Err(err),
41        }
42    }
43
44    pub(crate) fn resolve_name(&self, name: &str) -> crate::schema::Bin {
45        if let Some(path) = self.bins.get(name) {
46            return path.clone();
47        }
48
49        if self.fallback {
50            if let Some(path) = crate::cargo::cargo_bin_opt(name) {
51                return crate::schema::Bin::Path(path);
52            }
53        }
54
55        crate::schema::Bin::Name(name.to_owned())
56    }
57}
58
59impl Default for BinRegistry {
60    fn default() -> Self {
61        Self::new()
62    }
63}