Jonas Platte f304c04d1d Add 'ruma-events/' from commit '00692d532e26f58d48ead9589dc823403c6e59a5'
git-subtree-dir: ruma-events
git-subtree-mainline: d59a616e2c363507a89c92f34aa67e86ee2cfb49
git-subtree-split: 00692d532e26f58d48ead9589dc823403c6e59a5
2020-06-10 22:07:24 +02:00

31 lines
808 B
Rust

use serde::de::DeserializeOwned;
use serde_json::Value as JsonValue;
pub fn try_variant_from_value<T, U, E>(value: JsonValue, variant: fn(T) -> U) -> Result<U, E>
where
T: DeserializeOwned,
E: serde::de::Error,
{
serde_json::from_value(value)
.map(variant)
.map_err(serde_json_error_to_generic_de_error)
}
pub fn serde_json_error_to_generic_de_error<E: serde::de::Error>(error: serde_json::Error) -> E {
E::custom(error.to_string())
}
pub fn get_field<T, E>(value: &JsonValue, field: &'static str) -> Result<T, E>
where
T: DeserializeOwned,
E: serde::de::Error,
{
serde_json::from_value(
value
.get(field)
.cloned()
.ok_or_else(|| E::missing_field(field))?,
)
.map_err(serde_json_error_to_generic_de_error)
}