grass/dev/strategy/alias/
local.rs1use 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}