use async_trait::async_trait;
use super::context::RequestContext;
use super::error::MiddlewareError;
#[async_trait]
pub trait A2aMiddleware: Send + Sync {
async fn before_request(&self, ctx: &mut RequestContext) -> Result<(), MiddlewareError>;
fn security_contribution(&self) -> SecurityContribution {
SecurityContribution::default()
}
}
#[derive(Debug, Clone, Default)]
pub struct SecurityContribution {
pub schemes: Vec<(String, turul_a2a_proto::SecurityScheme)>,
pub requirements: Vec<turul_a2a_proto::SecurityRequirement>,
}
impl SecurityContribution {
pub fn new() -> Self {
Self::default()
}
pub fn with_scheme(
mut self,
name: impl Into<String>,
scheme: turul_a2a_proto::SecurityScheme,
scopes: Vec<String>,
) -> Self {
let name = name.into();
self.schemes.push((name.clone(), scheme));
let mut req_schemes = std::collections::HashMap::new();
req_schemes.insert(name, turul_a2a_proto::StringList { list: scopes });
self.requirements
.push(turul_a2a_proto::SecurityRequirement {
schemes: req_schemes,
});
self
}
pub fn is_empty(&self) -> bool {
self.schemes.is_empty() && self.requirements.is_empty()
}
}