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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
use crate::{
configuration::{Configuration, ConfigurationInfo},
error::ConfigurationError,
format::Format,
source::{AsyncSource, Source},
};
use async_trait::async_trait;
pub trait Provider {
fn collect(&self) -> Result<Configuration, ConfigurationError>;
fn describe(&self) -> ConfigurationInfo;
}
#[async_trait]
pub trait AsyncProvider: Send + Sync {
async fn collect(&self) -> Result<Configuration, ConfigurationError>;
fn describe(&self) -> ConfigurationInfo;
}
pub struct ProviderStruct<S, T> {
source: S,
format: T,
}
impl<S: Source, T: Format> ProviderStruct<S, T> {
pub fn synchronous(s: S, t: T) -> Self {
ProviderStruct {
source: s,
format: t,
}
}
}
impl<S, T> ProviderStruct<S, T>
where
S: AsyncSource + Send + Sync,
T: Format + Send + Sync,
{
pub fn asynchronous(s: S, t: T) -> Self {
ProviderStruct {
source: s,
format: t,
}
}
}
impl<S, T> Provider for ProviderStruct<S, T>
where
S: Source,
T: Format,
{
fn collect(&self) -> Result<Configuration, ConfigurationError> {
let node = self.format.transform(self.source.collect()?)?;
Ok(Configuration::new_singular(self.describe(), node))
}
fn describe(&self) -> ConfigurationInfo {
ConfigurationInfo::new(self.source.describe(), self.format.describe())
}
}
#[async_trait]
impl<S, T> AsyncProvider for ProviderStruct<S, T>
where
S: AsyncSource + Send + Sync,
T: Format + Send + Sync,
{
async fn collect(&self) -> Result<Configuration, ConfigurationError> {
let node = self.format.transform(self.source.collect().await?)?;
Ok(Configuration::new_singular(self.describe(), node))
}
fn describe(&self) -> ConfigurationInfo {
ConfigurationInfo::new(self.source.describe(), self.format.describe())
}
}