use std::{fmt, str::FromStr}; use ruma::{canonical_json::try_from_json_map, CanonicalJsonError, CanonicalJsonObject}; use crate::Result; /// Fallible conversion from any value that implements `Serialize` to a /// `CanonicalJsonObject`. /// /// `value` must serialize to an `serde_json::Value::Object`. pub fn to_canonical_object( value: T, ) -> Result { use serde::ser::Error; match serde_json::to_value(value).map_err(CanonicalJsonError::SerDe)? { | serde_json::Value::Object(map) => try_from_json_map(map), | _ => Err(CanonicalJsonError::SerDe(serde_json::Error::custom("Value must be an object"))), } } pub fn deserialize_from_str< 'de, D: serde::de::Deserializer<'de>, T: FromStr, E: fmt::Display, >( deserializer: D, ) -> Result { struct Visitor, E>(std::marker::PhantomData); impl, Err: fmt::Display> serde::de::Visitor<'_> for Visitor { type Value = T; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { write!(formatter, "a parsable string") } fn visit_str(self, v: &str) -> Result where E: serde::de::Error, { v.parse().map_err(serde::de::Error::custom) } } deserializer.deserialize_str(Visitor(std::marker::PhantomData)) }