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