use a2a_lf::AgentCard;
use serde_json::Value;
use super::A2aError;
pub(crate) fn decode(mut card: Value) -> Result<AgentCard, A2aError> {
restore_empty_scopes(&mut card);
let card: AgentCard = serde_json::from_value(card)
.map_err(|_| A2aError::InvalidCard("it is not a JSON Agent Card"))?;
if card.name.trim().is_empty() {
return Err(A2aError::InvalidCard("it has no name"));
}
Ok(card)
}
fn restore_empty_scopes(card: &mut Value) {
restore_in(card.get_mut("securityRequirements"));
if let Some(Value::Array(skills)) = card.get_mut("skills") {
for skill in skills {
restore_in(skill.get_mut("securityRequirements"));
}
}
}
fn restore_in(requirements: Option<&mut Value>) {
let Some(Value::Array(requirements)) = requirements else {
return;
};
for requirement in requirements {
let Some(Value::Object(schemes)) = requirement.get_mut("schemes") else {
continue;
};
for scopes in schemes.values_mut() {
if let Value::Object(wrapped) = scopes {
wrapped
.entry("list")
.or_insert_with(|| Value::Array(Vec::new()));
}
}
}
}
#[cfg(test)]
mod tests;