use crate::error::Result;
use crate::message::MessageConverter;
use a2a_rs::domain::{message::Message, task::Task};
use rmcp::{ClientJsonRpcMessage, ServerJsonRpcMessage};
use async_trait::async_trait;
use std::sync::Arc;
pub struct RmcpToA2aTransport {
converter: Arc<MessageConverter>,
}
impl RmcpToA2aTransport {
pub fn new(converter: Arc<MessageConverter>) -> Self {
Self { converter }
}
pub async fn convert_request(&self, req: &ClientJsonRpcMessage, task_id: &str) -> Result<Task> {
let message = self.converter.rmcp_to_a2a_request(req)?;
let task = Task {
id: task_id.to_string(),
status: a2a_rs::domain::task::TaskStatus {
state: a2a_rs::domain::task::TaskState::Submitted,
message: Some("Task submitted".to_string()),
},
messages: vec![message],
artifacts: Vec::new(),
history_ttl: Some(3600), metadata: None,
};
Ok(task)
}
pub async fn convert_response(&self, task: &Task, id: Option<serde_json::Value>) -> Result<ServerJsonRpcMessage> {
let agent_message = self.converter.extract_agent_message(task)?;
self.converter.a2a_to_rmcp_response(agent_message, id)
}
}
#[async_trait]
pub trait RmcpToA2aHandler {
async fn process_rmcp_request(&self, req: ClientJsonRpcMessage) -> Result<ServerJsonRpcMessage>;
}