1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use std::{fmt, ops::Deref};
use crate::Storage;
pub struct Config<S, G, V> {
pub storage: S,
pub generate: G,
pub verify: V,
}
impl<S, G, V> Config<S, G, V>
where
S: Storage,
G: Fn() -> String,
V: Fn(&str) -> bool,
{
pub fn storage(&self) -> &S {
&self.storage
}
pub fn generate(&self) -> String {
(self.generate)()
}
pub fn verify(&self, key: &str) -> bool {
(self.verify)(key)
}
}
impl<S, G, V> fmt::Debug for Config<S, G, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Config").finish()
}
}
impl<S, G, V> AsRef<S> for Config<S, G, V> {
fn as_ref(&self) -> &S {
&self.storage
}
}
impl<S, G, V> Deref for Config<S, G, V> {
type Target = S;
fn deref(&self) -> &S {
&self.storage
}
}