grass/dev/strategy/alias/
resolves.rs

1use std::{rc::Rc, sync::Arc};
2
3use crate::dev::{Category, RepositoryLocation};
4
5use super::AliasStrategyError;
6
7pub trait ResolvesAlias {
8    type Resolved;
9
10    fn resolve_alias<F: FnOnce(&str) -> Result<Box<str>, AliasStrategyError>>(
11        &self,
12        resolver: F,
13    ) -> Result<Self::Resolved, AliasStrategyError>;
14}
15
16impl ResolvesAlias for String {
17    type Resolved = String;
18
19    fn resolve_alias<F: FnOnce(&str) -> Result<Box<str>, AliasStrategyError>>(
20        &self,
21        resolver: F,
22    ) -> Result<Self::Resolved, AliasStrategyError> {
23        Ok(String::from(resolver(self.as_str())?))
24    }
25}
26
27impl ResolvesAlias for Box<str> {
28    type Resolved = Box<str>;
29
30    fn resolve_alias<F: FnOnce(&str) -> Result<Box<str>, AliasStrategyError>>(
31        &self,
32        resolver: F,
33    ) -> Result<Self::Resolved, AliasStrategyError> {
34        resolver(self.as_ref())
35    }
36}
37
38impl ResolvesAlias for Rc<str> {
39    type Resolved = Rc<str>;
40
41    fn resolve_alias<F: FnOnce(&str) -> Result<Box<str>, AliasStrategyError>>(
42        &self,
43        resolver: F,
44    ) -> Result<Self::Resolved, AliasStrategyError> {
45        Ok(Rc::from(resolver(self.as_ref())?))
46    }
47}
48
49impl ResolvesAlias for Arc<str> {
50    type Resolved = Arc<str>;
51
52    fn resolve_alias<F: FnOnce(&str) -> Result<Box<str>, AliasStrategyError>>(
53        &self,
54        resolver: F,
55    ) -> Result<Self::Resolved, AliasStrategyError> {
56        Ok(Arc::from(resolver(self.as_ref())?))
57    }
58}
59
60impl ResolvesAlias for str {
61    type Resolved = Box<str>;
62
63    fn resolve_alias<F: FnOnce(&str) -> Result<Box<str>, AliasStrategyError>>(
64        &self,
65        resolver: F,
66    ) -> Result<Self::Resolved, AliasStrategyError> {
67        resolver(self)
68    }
69}
70
71impl ResolvesAlias for &str {
72    type Resolved = Box<str>;
73
74    fn resolve_alias<F: FnOnce(&str) -> Result<Box<str>, AliasStrategyError>>(
75        &self,
76        resolver: F,
77    ) -> Result<Self::Resolved, AliasStrategyError> {
78        resolver(self)
79    }
80}
81
82impl ResolvesAlias for RepositoryLocation {
83    type Resolved = RepositoryLocation;
84
85    fn resolve_alias<F: FnOnce(&str) -> Result<Box<str>, AliasStrategyError>>(
86        &self,
87        resolver: F,
88    ) -> Result<Self::Resolved, AliasStrategyError> {
89        Ok(RepositoryLocation {
90            category: Category::from(resolver(self.category.as_ref())?.as_ref()),
91            repository: self.repository.clone(),
92        })
93    }
94}