use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize)]
pub struct JsonRpcRequest {
pub jsonrpc: String,
pub id: Option<serde_json::Value>,
pub method: String,
#[serde(default)]
pub params: serde_json::Value,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JsonRpcResponse {
pub jsonrpc: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub result: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<JsonRpcError>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JsonRpcError {
pub code: i32,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
}
impl JsonRpcResponse {
pub fn success(id: Option<serde_json::Value>, result: serde_json::Value) -> Self {
Self {
jsonrpc: "2.0".to_string(),
id,
result: Some(result),
error: None,
}
}
pub fn error(id: Option<serde_json::Value>, code: i32, message: String) -> Self {
Self {
jsonrpc: "2.0".to_string(),
id,
result: None,
error: Some(JsonRpcError {
code,
message,
data: None,
}),
}
}
}
pub const PARSE_ERROR: i32 = -32700;
pub const INVALID_REQUEST: i32 = -32600;
pub const METHOD_NOT_FOUND: i32 = -32601;
pub const INVALID_PARAMS: i32 = -32602;
pub const INTERNAL_ERROR: i32 = -32603;
pub const R_BUSY: i32 = -32000;
pub const R_NOT_AT_PROMPT: i32 = -32001;
pub const INPUT_ALREADY_PENDING: i32 = -32002;
pub const USER_IS_TYPING: i32 = -32003;
pub const INCOMPLETE_INPUT: i32 = -32004;
pub const R_EVAL_NOT_ALLOWED: i32 = -32005;
pub const INPUT_NOT_APPROVED: i32 = -32006;
#[derive(Debug, Deserialize)]
pub struct EvaluateParams {
pub code: String,
#[serde(default)]
pub visible: bool,
#[serde(default)]
pub timeout_ms: Option<u64>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct EvaluateResult {
pub stdout: String,
pub stderr: String,
pub value: Option<String>,
pub error: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct UserInputParams {
pub code: String,
}
#[derive(Debug, Serialize)]
pub struct UserInputResult {
pub accepted: bool,
}
#[derive(Debug, Serialize)]
pub struct ShutdownResult {
pub accepted: bool,
}
use super::policy::IpcPolicy;
#[derive(Debug, Serialize, Deserialize)]
pub struct RSessionInfo {
pub version: String,
pub platform: String,
pub locale: String,
pub cwd: String,
pub loaded_namespaces: Vec<String>,
pub attached_packages: Vec<String>,
pub lib_paths: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SessionResult {
pub arf_version: String,
pub pid: u32,
pub os: String,
pub arch: String,
pub r_home: Option<String>,
pub socket_path: String,
pub started_at: String,
pub log_file: Option<String>,
pub history_session_id: Option<i64>,
pub ipc_policy: IpcPolicy,
pub r: Option<RSessionInfo>,
pub r_unavailable_reason: Option<String>,
pub hint: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct HistoryParams {
#[serde(default = "default_history_limit")]
pub limit: i64,
#[serde(default)]
pub all_sessions: bool,
#[serde(default)]
pub cwd: Option<String>,
#[serde(default)]
pub grep: Option<String>,
#[serde(default)]
pub since: Option<String>,
}
fn default_history_limit() -> i64 {
50
}
#[derive(Debug, Serialize)]
pub struct HistoryEntry {
pub command: String,
pub timestamp: Option<String>,
pub cwd: Option<String>,
pub exit_status: Option<i64>,
pub session_id: Option<i64>,
}
#[derive(Debug, Serialize)]
pub struct HistoryResult {
pub entries: Vec<HistoryEntry>,
pub session_id: Option<i64>,
}
pub struct IpcRequest {
pub method: IpcMethod,
pub reply: tokio::sync::oneshot::Sender<IpcResponse>,
}
pub enum IpcMethod {
Evaluate {
code: String,
visible: bool,
timeout_ms: Option<u64>,
},
UserInput {
code: String,
},
Session,
}
pub enum IpcResponse {
Evaluate(EvaluateResult),
UserInput(UserInputResult),
Session(Box<SessionResult>),
Error {
code: i32,
message: String,
data: Option<serde_json::Value>,
},
}
impl IpcResponse {
pub fn error(code: i32, message: String) -> Self {
Self::Error {
code,
message,
data: None,
}
}
pub fn error_with_data(code: i32, message: String, data: serde_json::Value) -> Self {
Self::Error {
code,
message,
data: Some(data),
}
}
}