Skip to main content

securitydept_token_set_context/access_token_substrate/config/
validator.rs

1use super::AccessTokenSubstrateConfig;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4pub struct AccessTokenSubstrateConfigValidationError {
5    pub mode: &'static str,
6    pub field_path: String,
7    pub code: String,
8    pub message: String,
9}
10
11impl AccessTokenSubstrateConfigValidationError {
12    pub fn new(
13        field_path: impl Into<String>,
14        code: impl Into<String>,
15        message: impl Into<String>,
16    ) -> Self {
17        Self {
18            mode: "access_token_substrate",
19            field_path: field_path.into(),
20            code: code.into(),
21            message: message.into(),
22        }
23    }
24}
25
26impl std::fmt::Display for AccessTokenSubstrateConfigValidationError {
27    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
28        write!(
29            f,
30            "{} config validation failed for {} ({}): {}",
31            self.mode, self.field_path, self.code, self.message
32        )
33    }
34}
35
36impl std::error::Error for AccessTokenSubstrateConfigValidationError {}
37
38pub trait AccessTokenSubstrateConfigValidator {
39    fn validate_raw_access_token_substrate_config(
40        &self,
41        config: &AccessTokenSubstrateConfig,
42    ) -> Result<(), AccessTokenSubstrateConfigValidationError>;
43}
44
45#[derive(Debug, Clone, Copy, Default)]
46pub struct NoopAccessTokenSubstrateConfigValidator;
47
48impl AccessTokenSubstrateConfigValidator for NoopAccessTokenSubstrateConfigValidator {
49    fn validate_raw_access_token_substrate_config(
50        &self,
51        _config: &AccessTokenSubstrateConfig,
52    ) -> Result<(), AccessTokenSubstrateConfigValidationError> {
53        Ok(())
54    }
55}
56
57impl<V> AccessTokenSubstrateConfigValidator for &V
58where
59    V: AccessTokenSubstrateConfigValidator + ?Sized,
60{
61    fn validate_raw_access_token_substrate_config(
62        &self,
63        config: &AccessTokenSubstrateConfig,
64    ) -> Result<(), AccessTokenSubstrateConfigValidationError> {
65        (*self).validate_raw_access_token_substrate_config(config)
66    }
67}
68
69impl<V> AccessTokenSubstrateConfigValidator for [V]
70where
71    V: AccessTokenSubstrateConfigValidator,
72{
73    fn validate_raw_access_token_substrate_config(
74        &self,
75        config: &AccessTokenSubstrateConfig,
76    ) -> Result<(), AccessTokenSubstrateConfigValidationError> {
77        for validator in self {
78            validator.validate_raw_access_token_substrate_config(config)?;
79        }
80
81        Ok(())
82    }
83}
84
85impl<V, const N: usize> AccessTokenSubstrateConfigValidator for [V; N]
86where
87    V: AccessTokenSubstrateConfigValidator,
88{
89    fn validate_raw_access_token_substrate_config(
90        &self,
91        config: &AccessTokenSubstrateConfig,
92    ) -> Result<(), AccessTokenSubstrateConfigValidationError> {
93        self.as_slice()
94            .validate_raw_access_token_substrate_config(config)
95    }
96}
97
98impl<V> AccessTokenSubstrateConfigValidator for Vec<V>
99where
100    V: AccessTokenSubstrateConfigValidator,
101{
102    fn validate_raw_access_token_substrate_config(
103        &self,
104        config: &AccessTokenSubstrateConfig,
105    ) -> Result<(), AccessTokenSubstrateConfigValidationError> {
106        self.as_slice()
107            .validate_raw_access_token_substrate_config(config)
108    }
109}
110
111impl<A, B> AccessTokenSubstrateConfigValidator for (A, B)
112where
113    A: AccessTokenSubstrateConfigValidator,
114    B: AccessTokenSubstrateConfigValidator,
115{
116    fn validate_raw_access_token_substrate_config(
117        &self,
118        config: &AccessTokenSubstrateConfig,
119    ) -> Result<(), AccessTokenSubstrateConfigValidationError> {
120        self.0.validate_raw_access_token_substrate_config(config)?;
121        self.1.validate_raw_access_token_substrate_config(config)
122    }
123}
124
125impl<A, B, C> AccessTokenSubstrateConfigValidator for (A, B, C)
126where
127    A: AccessTokenSubstrateConfigValidator,
128    B: AccessTokenSubstrateConfigValidator,
129    C: AccessTokenSubstrateConfigValidator,
130{
131    fn validate_raw_access_token_substrate_config(
132        &self,
133        config: &AccessTokenSubstrateConfig,
134    ) -> Result<(), AccessTokenSubstrateConfigValidationError> {
135        self.0.validate_raw_access_token_substrate_config(config)?;
136        self.1.validate_raw_access_token_substrate_config(config)?;
137        self.2.validate_raw_access_token_substrate_config(config)
138    }
139}