use async_trait::async_trait;
use crate::domain::{A2AError, Message, Task};
#[async_trait]
pub trait AsyncMessageHandler: Send + Sync {
async fn process_message(
&self,
task_id: &str,
message: &Message,
session_id: Option<&str>,
) -> Result<Task, A2AError>;
async fn validate_message(&self, message: &Message) -> Result<(), A2AError> {
if message.parts.is_empty() {
return Err(A2AError::ValidationError {
field: "message.parts".to_string(),
message: "Message must contain at least one part".to_string(),
});
}
Ok(())
}
async fn transform_message(&self, message: Message) -> Result<Message, A2AError> {
Ok(message)
}
async fn handle_message_flow(
&self,
task_id: &str,
message: Message,
session_id: Option<&str>,
) -> Result<Task, A2AError> {
self.validate_message(&message).await?;
let transformed_message = self.transform_message(message).await?;
self.process_message(task_id, &transformed_message, session_id)
.await
}
}