huskies: merge 782

This commit is contained in:
dave
2026-04-28 10:56:09 +00:00
parent 01169332b3
commit 05d057a40a
6 changed files with 1267 additions and 1224 deletions
+64
View File
@@ -0,0 +1,64 @@
//! JSON-RPC 2.0 request/response types and helpers.
use poem::http::StatusCode;
use poem::{Body, Response};
use serde::{Deserialize, Serialize};
use serde_json::Value;
// ── JSON-RPC types ──────────────────────────────────────────────────────────
/// JSON-RPC request.
#[derive(Deserialize)]
pub(super) struct JsonRpcRequest {
pub(super) jsonrpc: String,
pub(super) id: Option<Value>,
pub(super) method: String,
#[serde(default)]
pub(super) params: Value,
}
/// JSON-RPC response.
#[derive(Serialize)]
pub(crate) struct JsonRpcResponse {
jsonrpc: &'static str,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) id: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) result: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) error: Option<JsonRpcError>,
}
#[derive(Debug, Serialize)]
pub(crate) struct JsonRpcError {
code: i64,
pub(crate) message: String,
}
impl JsonRpcResponse {
pub(crate) fn success(id: Option<Value>, result: Value) -> Self {
Self {
jsonrpc: "2.0",
id,
result: Some(result),
error: None,
}
}
pub(crate) fn error(id: Option<Value>, code: i64, message: String) -> Self {
Self {
jsonrpc: "2.0",
id,
result: None,
error: Some(JsonRpcError { code, message }),
}
}
}
pub(super) fn to_json_response(resp: JsonRpcResponse) -> Response {
let body = serde_json::to_vec(&resp).unwrap_or_default();
Response::builder()
.status(StatusCode::OK)
.header("Content-Type", "application/json")
.body(Body::from(body))
}