1use crate::a2a::{metadata::to_a2a_meta_key, parts, Message, Role};
2use adk_core::{Content, Event, EventActions, Result};
3use serde_json::{Map, Value};
4
5pub fn event_to_message(event: &Event) -> Result<Message> {
6 let role = if event.author == "user" { Role::User } else { Role::Agent };
7
8 let content = event
9 .llm_response
10 .content
11 .as_ref()
12 .ok_or_else(|| adk_core::AdkError::Agent("Event has no content".to_string()))?;
13
14 let a2a_parts = parts::adk_parts_to_a2a(&content.parts, &[])?;
15
16 let mut metadata = Map::new();
17 if event.actions.escalate {
18 metadata.insert(to_a2a_meta_key("escalate"), Value::Bool(true));
19 }
20 if let Some(agent) = &event.actions.transfer_to_agent {
21 metadata.insert(to_a2a_meta_key("transfer_to_agent"), Value::String(agent.clone()));
22 }
23
24 Ok(Message::builder()
25 .role(role)
26 .parts(a2a_parts)
27 .message_id(event.invocation_id.clone())
28 .metadata(if metadata.is_empty() { None } else { Some(metadata) })
29 .build())
30}
31
32pub fn message_to_event(message: &Message, invocation_id: String) -> Result<Event> {
33 let adk_parts = parts::a2a_parts_to_adk(&message.parts)?;
34
35 let mut actions = EventActions::default();
36 if let Some(meta) = &message.metadata {
37 if let Some(Value::Bool(true)) = meta.get(&to_a2a_meta_key("escalate")) {
38 actions.escalate = true;
39 }
40 if let Some(Value::String(agent)) = meta.get(&to_a2a_meta_key("transfer_to_agent")) {
41 actions.transfer_to_agent = Some(agent.clone());
42 }
43 }
44
45 let author = match message.role {
46 Role::User => "user".to_string(),
47 Role::Agent => "agent".to_string(),
48 };
49
50 let mut event = Event::new(invocation_id);
51 event.author = author;
52 event.llm_response.content = Some(Content { role: "user".to_string(), parts: adk_parts });
53 event.actions = actions;
54 Ok(event)
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn test_message_to_event() {
63 let message = Message::builder()
64 .role(Role::User)
65 .parts(vec![crate::a2a::Part::text("Hello".to_string())])
66 .message_id("msg-123".to_string())
67 .build();
68
69 let event = message_to_event(&message, "inv-123".to_string()).unwrap();
70 assert_eq!(event.invocation_id, "inv-123");
71 assert_eq!(event.author, "user");
72 }
73}