aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-10-19 02:27:14 -0400
committerJesse Luehrs <doy@tozt.net>2019-10-19 02:27:14 -0400
commit58169bf0a3dd4b1f9ace3ad861f312a9ed956430 (patch)
tree3ae250dc6a255e5fcf6c034b39e2b9e60cc4db1b
parent1f09b3c62f40987a184c0503277b45a24251ff77 (diff)
downloadteleterm-58169bf0a3dd4b1f9ace3ad861f312a9ed956430.tar.gz
teleterm-58169bf0a3dd4b1f9ace3ad861f312a9ed956430.zip
let allowed_login_methods take either a comma-separated string or a list
because we can't pass a list through an environment variable
-rw-r--r--src/config.rs57
1 files changed, 46 insertions, 11 deletions
diff --git a/src/config.rs b/src/config.rs
index 66069db..86d72b4 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -118,17 +118,52 @@ pub fn allowed_login_methods<'a, D>(
where
D: serde::de::Deserializer<'a>,
{
- Option::<Vec<String>>::deserialize(deserializer)?
- .map_or_else(
- || Ok(default_allowed_login_methods()),
- |methods| {
- methods
- .iter()
- .map(|s| crate::protocol::AuthType::try_from(s.as_ref()))
- .collect()
- },
- )
- .map_err(serde::de::Error::custom)
+ struct StringOrVec;
+
+ impl<'a> serde::de::Visitor<'a> for StringOrVec {
+ type Value = Vec<String>;
+
+ fn expecting(
+ &self,
+ formatter: &mut std::fmt::Formatter,
+ ) -> std::fmt::Result {
+ formatter.write_str("string or list")
+ }
+
+ fn visit_str<E>(
+ self,
+ value: &str,
+ ) -> std::result::Result<Self::Value, E>
+ where
+ E: serde::de::Error,
+ {
+ Ok(value
+ .split(',')
+ .map(std::string::ToString::to_string)
+ .collect())
+ }
+
+ fn visit_seq<A>(
+ self,
+ seq: A,
+ ) -> std::result::Result<Self::Value, A::Error>
+ where
+ A: serde::de::SeqAccess<'a>,
+ {
+ serde::de::Deserialize::deserialize(
+ serde::de::value::SeqAccessDeserializer::new(seq),
+ )
+ }
+ }
+
+ deserializer
+ .deserialize_any(StringOrVec)?
+ .iter()
+ .map(|s| {
+ crate::protocol::AuthType::try_from(s.as_str())
+ .map_err(serde::de::Error::custom)
+ })
+ .collect()
}
pub fn auth<'a, D>(