From 6410f91bd1269ad3a50289a37506ec052a5e6dbc Mon Sep 17 00:00:00 2001 From: Hristo Venev Date: Mon, 30 Sep 2019 14:55:11 +0300 Subject: Don't use `#[serde(flatten)]`. It breaks the error line numbers. --- src/config.rs | 100 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 83 insertions(+), 17 deletions(-) (limited to 'src/config.rs') diff --git a/src/config.rs b/src/config.rs index b755739..6269525 100644 --- a/src/config.rs +++ b/src/config.rs @@ -7,8 +7,8 @@ use serde_derive; use std::collections::HashMap; use std::path::PathBuf; -#[serde(deny_unknown_fields)] #[derive(serde_derive::Serialize, serde_derive::Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(deny_unknown_fields)] pub struct Source { pub url: String, pub psk: Option, @@ -18,21 +18,17 @@ pub struct Source { pub required: bool, } -#[serde(deny_unknown_fields)] #[derive(serde_derive::Serialize, serde_derive::Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(deny_unknown_fields)] pub struct Peer { pub source: Option, pub psk: Option, } -#[serde(deny_unknown_fields)] -#[derive(serde_derive::Serialize, serde_derive::Deserialize, Clone, PartialEq, Eq, Debug)] +#[derive(Clone, PartialEq, Eq, Debug)] pub struct GlobalConfig { - #[serde(default = "default_min_keepalive")] pub min_keepalive: u32, - #[serde(default = "default_max_keepalive")] pub max_keepalive: u32, - #[serde(default, rename = "peer")] pub peers: HashMap, } @@ -59,13 +55,11 @@ impl GlobalConfig { } } -#[serde(deny_unknown_fields)] -#[derive(serde_derive::Serialize, serde_derive::Deserialize, Clone, PartialEq, Eq, Debug)] +#[derive(Clone, PartialEq, Eq, Debug)] pub struct UpdaterConfig { pub cache_directory: Option, // Number of seconds between regular updates. - #[serde(default = "default_refresh_sec")] pub refresh_sec: u32, } @@ -79,21 +73,93 @@ impl Default for UpdaterConfig { } } -#[serde(deny_unknown_fields)] #[derive(serde_derive::Serialize, serde_derive::Deserialize, Default, Clone, Debug)] +#[serde(from = "ConfigRepr", into = "ConfigRepr")] pub struct Config { pub runtime_directory: Option, - - #[serde(flatten)] pub global: GlobalConfig, - - #[serde(flatten)] pub updater: UpdaterConfig, - - #[serde(rename = "source")] pub sources: HashMap, } +#[derive(serde_derive::Serialize, serde_derive::Deserialize)] +#[serde(deny_unknown_fields)] +struct ConfigRepr { + runtime_directory: Option, + cache_directory: Option, + + #[serde(default = "default_min_keepalive")] + min_keepalive: u32, + #[serde(default = "default_max_keepalive")] + max_keepalive: u32, + #[serde(default, rename = "peer")] + peers: HashMap, + + #[serde(default = "default_refresh_sec")] + refresh_sec: u32, + + #[serde(default, rename = "source")] + sources: HashMap, +} + +impl From for ConfigRepr { + #[inline] + fn from(v: Config) -> Self { + let Config { + runtime_directory, + global, + updater, + sources, + } = v; + let GlobalConfig { + min_keepalive, + max_keepalive, + peers, + } = global; + let UpdaterConfig { + cache_directory, + refresh_sec, + } = updater; + Self { + runtime_directory, + cache_directory, + min_keepalive, + max_keepalive, + peers, + refresh_sec, + sources, + } + } +} + +impl From for Config { + #[inline] + fn from(v: ConfigRepr) -> Self { + let ConfigRepr { + runtime_directory, + cache_directory, + min_keepalive, + max_keepalive, + peers, + refresh_sec, + sources, + } = v; + Self { + runtime_directory, + global: GlobalConfig { + min_keepalive, + max_keepalive, + peers, + }, + updater: UpdaterConfig { + cache_directory, + refresh_sec, + }, + sources, + } + } +} + #[inline] const fn default_min_keepalive() -> u32 { 10 -- cgit