1#[derive(Debug, thiserror::Error)]
2pub enum A2AClientError {
3 #[error("HTTP error: {0}")]
4 Http(#[from] reqwest::Error),
5 #[error("JSON error: {0}")]
6 Json(#[from] serde_json::Error),
7 #[error("SSE stream error: {0}")]
8 Sse(String),
9 #[error("A2A JSON-RPC error {code}: {message}")]
10 JsonRpc {
11 code: i64,
12 message: String,
13 data: Option<serde_json::Value>,
14 },
15 #[error("A2A task not found: {0}")]
16 TaskNotFound(String),
17 #[error("A2A task is not cancelable: {0}")]
18 TaskNotCancelable(String),
19 #[error("A2A operation unsupported: {0}")]
20 UnsupportedOperation(String),
21 #[error("A2A content type not supported: {0}")]
22 ContentTypeNotSupported(String),
23 #[error("A2A protocol version not supported: {0}")]
24 VersionNotSupported(String),
25 #[error("A2A invalid agent card: {0}")]
26 InvalidAgentCard(String),
27 #[error("A2A invalid stream response: {0}")]
28 InvalidStreamResponse(String),
29 #[error("A2A capability mismatch: {0}")]
30 CapabilityMismatch(String),
31}
32
33pub type A2AClientResult<T> = Result<T, A2AClientError>;
34
35pub fn map_jsonrpc_error(
48 error: super::jsonrpc::JsonRpcError,
49 task_id_hint: Option<&str>,
50) -> A2AClientError {
51 match error.code {
52 -32001 => A2AClientError::TaskNotFound(task_id_hint.unwrap_or_default().to_string()),
53 -32002 => A2AClientError::TaskNotCancelable(task_id_hint.unwrap_or_default().to_string()),
54 -32004 => A2AClientError::UnsupportedOperation(error.message),
55 -32005 => A2AClientError::ContentTypeNotSupported(error.message),
56 -32009 => A2AClientError::VersionNotSupported(error.message),
57 _ => A2AClientError::JsonRpc {
58 code: error.code,
59 message: error.message,
60 data: error.data,
61 },
62 }
63}