diff --git a/ruma-serde/src/urlencoded/de/val_or_vec.rs b/ruma-serde/src/urlencoded/de/val_or_vec.rs index 0101cabd..eda188b8 100644 --- a/ruma-serde/src/urlencoded/de/val_or_vec.rs +++ b/ruma-serde/src/urlencoded/de/val_or_vec.rs @@ -36,6 +36,17 @@ impl ValOrVec { ValOrVec::Vec(vec) => vec.push(new_val), } } + + fn deserialize_val(self, f: F) -> Result + where + F: FnOnce(T) -> Result, + E: de::Error, + { + match self { + ValOrVec::Val(val) => f(val), + ValOrVec::Vec(_) => Err(de::Error::custom("unsupported value")), + } + } } impl IntoIterator for ValOrVec { @@ -89,10 +100,7 @@ macro_rules! forward_to_part { fn $method(self, visitor: V) -> Result where V: de::Visitor<'de> { - match self { - ValOrVec::Val(val) => val.$method(visitor), - ValOrVec::Vec(_) => Err(de::Error::custom("unsupported value")), - } + self.deserialize_val(move |val| val.$method(visitor)) } )* } @@ -130,20 +138,14 @@ where where V: de::Visitor<'de>, { - match self { - ValOrVec::Val(val) => val.deserialize_enum(name, variants, visitor), - ValOrVec::Vec(_) => Err(de::Error::custom("unsupported value")), - } + self.deserialize_val(move |val| val.deserialize_enum(name, variants, visitor)) } fn deserialize_tuple(self, len: usize, visitor: V) -> Result where V: de::Visitor<'de>, { - match self { - ValOrVec::Val(val) => val.deserialize_tuple(len, visitor), - ValOrVec::Vec(_) => Err(de::Error::custom("unsupported value")), - } + self.deserialize_val(move |val| val.deserialize_tuple(len, visitor)) } fn deserialize_struct( @@ -155,10 +157,7 @@ where where V: de::Visitor<'de>, { - match self { - ValOrVec::Val(val) => val.deserialize_struct(name, fields, visitor), - ValOrVec::Vec(_) => Err(de::Error::custom("unsupported value")), - } + self.deserialize_val(move |val| val.deserialize_struct(name, fields, visitor)) } fn deserialize_unit_struct( @@ -169,10 +168,7 @@ where where V: de::Visitor<'de>, { - match self { - ValOrVec::Val(val) => val.deserialize_unit_struct(name, visitor), - ValOrVec::Vec(_) => Err(de::Error::custom("unsupported value")), - } + self.deserialize_val(move |val| val.deserialize_unit_struct(name, visitor)) } fn deserialize_tuple_struct( @@ -184,10 +180,7 @@ where where V: de::Visitor<'de>, { - match self { - ValOrVec::Val(val) => val.deserialize_tuple_struct(name, len, visitor), - ValOrVec::Vec(_) => Err(de::Error::custom("unsupported value")), - } + self.deserialize_val(move |val| val.deserialize_tuple_struct(name, len, visitor)) } fn deserialize_newtype_struct( @@ -198,10 +191,7 @@ where where V: de::Visitor<'de>, { - match self { - ValOrVec::Val(val) => val.deserialize_newtype_struct(name, visitor), - ValOrVec::Vec(_) => Err(de::Error::custom("unsupported value")), - } + self.deserialize_val(move |val| val.deserialize_newtype_struct(name, visitor)) } forward_to_part! {