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}