grass/dev/strategy/alias/
local.rs

1use crate::dev::config::GrassConfig;
2
3use super::{Alias, AliasStrategy, AliasStrategyError, Result};
4
5pub struct LocalAliasStrategy<'a> {
6    config: &'a GrassConfig,
7}
8
9impl<'a> AliasStrategy for LocalAliasStrategy<'a> {
10    fn list_all_aliases<T>(&self) -> Result<T>
11    where
12        T: FromIterator<super::Alias>,
13    {
14        let result = self
15            .config
16            .category
17            .iter()
18            .flat_map(|(_, category)| {
19                let category = category.borrow();
20                let result: Vec<_> = category
21                    .alias
22                    .iter()
23                    .map(|alias| Alias {
24                        alias: alias.into(),
25                        category: category.name.clone().into(),
26                    })
27                    .collect();
28                result
29            })
30            .collect();
31
32        Ok(result)
33    }
34
35    fn list_aliases_for_category<T, U>(&self, category: T) -> Result<U>
36    where
37        T: AsRef<str>,
38        U: FromIterator<super::Alias>,
39    {
40        let category = match self.config.category.get(category.as_ref()) {
41            Some(category) => category,
42            None => {
43                return Err(AliasStrategyError::CategoryNotFound {
44                    context: "When retrieving the category from the configuration".into(),
45                    reason: "Category doesn't exist".into(),
46                })
47            }
48        };
49
50        let category = category.borrow();
51
52        let result = category
53            .alias
54            .iter()
55            .map(|alias| Alias {
56                alias: alias.into(),
57                category: category.name.clone().into(),
58            })
59            .collect();
60
61        Ok(result)
62    }
63
64    fn resolve_alias<T: super::ResolvesAlias>(&self, input: T) -> Result<T::Resolved> {
65        input.resolve_alias(|input| match self.config.aliases.get(input) {
66            Some(alias) => Ok(Box::from((*alias.as_ref()).borrow().name.as_ref())),
67            None => Ok(Box::from(input)),
68        })
69    }
70}
71
72impl<'a> LocalAliasStrategy<'a> {
73    pub fn new(config: &'a GrassConfig) -> Self {
74        LocalAliasStrategy { config }
75    }
76}