Skip to main content

acp_utils/
meta.rs

1use agent_client_protocol::schema::v2::Meta;
2use serde::{Serialize, de::DeserializeOwned};
3
4/// Serialize metadata, optionally under an extension namespace. Empty objects are omitted.
5pub 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
18/// Decode metadata, treating absent or invalid values as the type's default.
19pub 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}