use async_trait::async_trait;
use crate::domain::{A2AError, AgentCard, AgentSkill};
#[async_trait]
pub trait AgentInfoProvider: Send + Sync {
async fn get_agent_card(&self) -> Result<AgentCard, A2AError>;
async fn get_skills(&self) -> Result<Vec<AgentSkill>, A2AError> {
let card = self.get_agent_card().await?;
Ok(card.skills)
}
async fn get_skill_by_id(&self, id: &str) -> Result<Option<AgentSkill>, A2AError> {
let skills = self.get_skills().await?;
Ok(skills.into_iter().find(|s| s.id == id))
}
async fn has_skill(&self, id: &str) -> Result<bool, A2AError> {
let skill = self.get_skill_by_id(id).await?;
Ok(skill.is_some())
}
async fn get_authenticated_extended_card(&self) -> Result<AgentCard, A2AError> {
Err(A2AError::AuthenticatedExtendedCardNotConfigured)
}
}