use std::borrow::Cow;
use a2a_protocol_types::error::A2aError;
use crate::error::ServerError;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RpcSystem {
JsonRpc,
HttpJson,
#[cfg_attr(not(feature = "grpc"), allow(dead_code))]
Grpc,
}
impl RpcSystem {
pub const fn name(self) -> &'static str {
match self {
Self::JsonRpc => "jsonrpc",
Self::HttpJson => "a2a_http_json",
Self::Grpc => "grpc",
}
}
}
pub trait WireStatus {
fn wire_status(&self, system: RpcSystem) -> Cow<'static, str>;
}
impl WireStatus for ServerError {
fn wire_status(&self, system: RpcSystem) -> Cow<'static, str> {
match system {
RpcSystem::JsonRpc => Cow::Owned(self.to_a2a_error().code.as_i32().to_string()),
RpcSystem::HttpJson => Cow::Owned(self.http_status().to_string()),
#[cfg(feature = "grpc")]
RpcSystem::Grpc => Cow::Borrowed(crate::dispatch::grpc::grpc_status_name(self)),
#[cfg(not(feature = "grpc"))]
RpcSystem::Grpc => Cow::Borrowed("INTERNAL"),
}
}
}
impl WireStatus for A2aError {
fn wire_status(&self, system: RpcSystem) -> Cow<'static, str> {
ServerError::Protocol(self.clone()).wire_status(system)
}
}
pub fn a2a_method(method: &str) -> &'static str {
match method {
"SendMessage" => "lf.a2a.v1.A2AService/SendMessage",
"SendStreamingMessage" | "message/stream" => "lf.a2a.v1.A2AService/SendStreamingMessage",
"GetTask" => "lf.a2a.v1.A2AService/GetTask",
"ListTasks" => "lf.a2a.v1.A2AService/ListTasks",
"CancelTask" => "lf.a2a.v1.A2AService/CancelTask",
"SubscribeToTask" => "lf.a2a.v1.A2AService/SubscribeToTask",
"CreateTaskPushNotificationConfig" => {
"lf.a2a.v1.A2AService/CreateTaskPushNotificationConfig"
}
"GetTaskPushNotificationConfig" => "lf.a2a.v1.A2AService/GetTaskPushNotificationConfig",
"ListTaskPushNotificationConfigs" => "lf.a2a.v1.A2AService/ListTaskPushNotificationConfigs",
"DeleteTaskPushNotificationConfig" => {
"lf.a2a.v1.A2AService/DeleteTaskPushNotificationConfig"
}
"GetExtendedAgentCard" => "lf.a2a.v1.A2AService/GetExtendedAgentCard",
_ => OTHER,
}
}
pub const OTHER: &str = "_OTHER";