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