diff --git a/src/management/mod.rs b/src/management/mod.rs index b0f3412..999b4a2 100644 --- a/src/management/mod.rs +++ b/src/management/mod.rs @@ -239,7 +239,7 @@ struct CreateInput { text_content: String, start_date: String, end_date: String, - #[serde(default)] + #[serde(default, deserialize_with = "one_or_many")] flags: Vec, } @@ -325,6 +325,24 @@ async fn delete_announcement( // ── Helpers ─────────────────────────────────────────────────────────────────── +fn one_or_many<'de, D: serde::Deserializer<'de>>(d: D) -> Result, D::Error> { + use serde::de; + struct OneOrMany; + impl<'de> de::Visitor<'de> for OneOrMany { + type Value = Vec; + fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + f.write_str("a string or list of strings") + } + fn visit_str(self, v: &str) -> Result, E> { + Ok(vec![v.to_owned()]) + } + fn visit_seq>(self, seq: A) -> Result, A::Error> { + de::Deserialize::deserialize(de::value::SeqAccessDeserializer::new(seq)) + } + } + d.deserialize_any(OneOrMany) +} + fn escape_html(s: &str) -> String { s.replace('&', "&") .replace('<', "<")