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}