pass_it_on/configuration/
client_configuration_file.rs

1use crate::configuration::{collect_interfaces, ClientConfiguration};
2use crate::interfaces::{Interface, InterfaceConfig};
3use crate::Error;
4use serde::Deserialize;
5
6/// Client configuration parsed from TOML that handles any [`InterfaceConfig`][`crate::interfaces::InterfaceConfig`].
7#[derive(Deserialize, Debug)]
8pub(super) struct ClientConfigFileParser {
9    client: ClientConfigFile,
10}
11
12/// Serde compatible representation of [`ClientConfiguration`]
13#[derive(Deserialize, Debug)]
14pub struct ClientConfigFile {
15    key: String,
16    interface: Vec<Box<dyn InterfaceConfig>>,
17}
18
19impl ClientConfigFileParser {
20    /// Parse [`ClientConfiguration`] from provided TOML.
21    pub fn from(string: &str) -> Result<ClientConfiguration, Error> {
22        let parsed: ClientConfigFileParser = toml::from_str(string)?;
23        parsed.client.try_into()
24    }
25}
26
27impl TryFrom<ClientConfigFile> for ClientConfiguration {
28    type Error = Error;
29
30    fn try_from(value: ClientConfigFile) -> Result<Self, Self::Error> {
31        let interfaces: Vec<Box<dyn Interface + Send>> = collect_interfaces(value.interface)?;
32        ClientConfiguration::new(value.key.as_str(), interfaces)
33    }
34}