Skip to main content

utils/
meta.rs

1use serde::{Serialize, de::DeserializeOwned};
2use serde_json::{Map, Value};
3
4pub fn to_meta<T: Serialize>(value: &T, namespace: Option<&str>) -> Option<Map<String, Value>> {
5    let Value::Object(map) = serde_json::to_value(value).expect("metadata should serialize") else {
6        panic!("metadata must serialize as an object");
7    };
8    if map.is_empty() {
9        return None;
10    }
11    Some(match namespace {
12        Some(namespace) => Map::from_iter([(namespace.to_owned(), Value::Object(map))]),
13        None => map,
14    })
15}
16
17pub fn from_meta<T: DeserializeOwned + Default>(meta: Option<&Map<String, Value>>, namespace: Option<&str>) -> T {
18    meta.and_then(|meta| match namespace {
19        Some(namespace) => meta.get(namespace).cloned(),
20        None => Some(Value::Object(meta.clone())),
21    })
22    .and_then(|value| serde_json::from_value(value).ok())
23    .unwrap_or_default()
24}