use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum JsonRpcId {
Number(i64),
String(String),
Null,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct JsonRpcResponse {
pub jsonrpc: String,
pub id: Option<JsonRpcId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub result: Option<Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<JsonRpcError>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct JsonRpcError {
pub code: i64,
pub message: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub data: Option<Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AcpTimeoutErrorData {
pub kind: String,
pub method: String,
pub id: Option<JsonRpcId>,
#[serde(rename = "timeoutMs")]
pub timeout_ms: f64,
#[serde(default, rename = "exitCode", skip_serializing_if = "Option::is_none")]
pub exit_code: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub killed: Option<bool>,
#[serde(
default,
rename = "transportState",
skip_serializing_if = "Option::is_none"
)]
pub transport_state: Option<String>,
#[serde(rename = "recentActivity")]
pub recent_activity: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct UnknownSessionErrorData {
pub kind: String,
#[serde(rename = "sessionId", skip_serializing_if = "Option::is_none", default)]
pub session_id: Option<String>,
}
pub fn is_unknown_session(error: &JsonRpcError) -> bool {
error
.data
.as_ref()
.and_then(|data| data.as_object())
.is_some_and(|data| data.get("kind").and_then(Value::as_str) == Some("unknown_session"))
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct JsonRpcNotification {
pub jsonrpc: String,
pub method: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub params: Option<Value>,
}