Skip to main content

bamboo_a2a/
error.rs

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
35/// Map A2A-specific JSON-RPC error codes to typed variants.
36///
37/// A2A v1.0 error codes:
38/// - -32001: TaskNotFoundError
39/// - -32002: TaskNotCancelableError
40/// - -32003: PushNotificationNotSupportedError (unused in MVP)
41/// - -32004: UnsupportedOperationError
42/// - -32005: ContentTypeNotSupportedError
43/// - -32006: InvalidAgentResponseError
44/// - -32007: ExtendedAgentCardNotConfiguredError
45/// - -32008: ExtensionSupportRequiredError
46/// - -32009: VersionNotSupportedError
47pub 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}