git-subtree-dir: ruma-events git-subtree-mainline: d59a616e2c363507a89c92f34aa67e86ee2cfb49 git-subtree-split: 00692d532e26f58d48ead9589dc823403c6e59a5
31 lines
808 B
Rust
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)
|
|
}
|