a2a_rs/port/
message_handler.rs1use async_trait::async_trait;
4
5use crate::domain::{A2AError, Message, Task};
6
7#[async_trait]
8pub trait AsyncMessageHandler: Send + Sync {
10 async fn process_message(
12 &self,
13 task_id: &str,
14 message: &Message,
15 session_id: Option<&str>,
16 ) -> Result<Task, A2AError>;
17
18 async fn validate_message(&self, message: &Message) -> Result<(), A2AError> {
20 if message.parts.is_empty() {
22 return Err(A2AError::ValidationError {
23 field: "message.parts".to_string(),
24 message: "Message must contain at least one part".to_string(),
25 });
26 }
27 Ok(())
28 }
29
30 async fn transform_message(&self, message: Message) -> Result<Message, A2AError> {
32 Ok(message)
34 }
35
36 async fn handle_message_flow(
38 &self,
39 task_id: &str,
40 message: Message,
41 session_id: Option<&str>,
42 ) -> Result<Task, A2AError> {
43 self.validate_message(&message).await?;
45
46 let transformed_message = self.transform_message(message).await?;
48
49 self.process_message(task_id, &transformed_message, session_id)
51 .await
52 }
53}