summaryrefslogtreecommitdiff
path: root/src/config.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config.rs')
-rw-r--r--src/config.rs36
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")?;