diff options
Diffstat (limited to 'src/config.rs')
-rw-r--r-- | src/config.rs | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/src/config.rs b/src/config.rs index 9e542d7..89a2b54 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,6 +1,6 @@ use anyhow::Context; -use serde::{Deserialize, Serialize}; -use std::{collections::HashMap, fs::read_to_string, net::SocketAddr, path::PathBuf}; +use serde::{Deserialize, Serialize, Deserializer, de::{Visitor, Error, SeqAccess, value}}; +use std::{collections::HashMap, fmt, fs::read_to_string, net::SocketAddr, path::PathBuf}; #[derive(Debug, Serialize, Deserialize)] pub struct Config { @@ -21,12 +21,14 @@ pub struct Limits { #[derive(Debug, Serialize, Deserialize)] pub struct HttpConfig { - pub bind: SocketAddr, + #[serde(deserialize_with = "string_or_seq")] + pub bind: Vec<SocketAddr>, } #[derive(Debug, Serialize, Deserialize)] pub struct HttpsConfig { - pub bind: SocketAddr, + #[serde(deserialize_with = "string_or_seq")] + pub bind: Vec<SocketAddr>, pub tls_cert: PathBuf, pub tls_key: PathBuf, } @@ -45,6 +47,32 @@ pub struct FileserverConfig { pub index: bool, } +// fall back to expecting a single string and putting that in a 1-length vector +fn string_or_seq<'de, D>(des: D) -> Result<Vec<SocketAddr>, D::Error> +where D: Deserializer<'de> { + struct StringOrList; + impl<'de> Visitor<'de> for StringOrList { + type Value = Vec<SocketAddr>; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("sequence or list") + } + + fn visit_str<E>(self, val: &str) -> Result<Vec<SocketAddr>, E> + where E: Error { + let addr = SocketAddr::deserialize(value::StrDeserializer::new(val))?; + Ok(vec![addr]) + } + + fn visit_seq<A>(self, val: A) -> Result<Vec<SocketAddr>, A::Error> + where A: SeqAccess<'de> { + Vec::<SocketAddr>::deserialize(value::SeqAccessDeserializer::new(val)) + } + } + + des.deserialize_any(StringOrList) +} + impl Config { pub fn load(path: &str) -> anyhow::Result<Config> { let raw = read_to_string(path).context("reading config file")?; |