zod_core/rpc/
mod.rs

1#![deny(unsafe_code)]
2
3pub mod codegen;
4pub mod error;
5pub mod server;
6
7pub type ResponseSender = futures::channel::mpsc::UnboundedSender<Response>;
8
9#[derive(serde::Deserialize, Debug)]
10#[serde(rename_all = "camelCase")]
11pub enum Request {
12    Exec {
13        id: usize,
14        #[serde(flatten)]
15        value: serde_json::Value,
16    },
17    CancelStream {
18        id: usize,
19    },
20}
21
22#[derive(serde::Serialize, Debug)]
23#[serde(rename_all = "camelCase")]
24pub enum Response {
25    Method {
26        id: usize,
27        data: serde_json::Value,
28    },
29    Stream {
30        id: usize,
31        data: serde_json::Value,
32    },
33    Error {
34        id: Option<usize>,
35        data: error::Error,
36    },
37}
38
39impl Response {
40    pub fn error(id: impl Into<Option<usize>>, err: impl Into<error::Error>) -> Self {
41        Self::Error {
42            id: id.into(),
43            data: err.into(),
44        }
45    }
46
47    pub fn method(id: usize, value: impl serde::ser::Serialize) -> Self {
48        match serde_json::to_value(value) {
49            Ok(data) => Self::Method { id, data },
50            Err(data) => Self::error(id, data),
51        }
52    }
53
54    pub fn stream(id: usize, value: impl serde::ser::Serialize) -> Self {
55        match serde_json::to_value(value) {
56            Ok(data) => Self::Stream { id, data },
57            Err(value) => Self::error(id, value),
58        }
59    }
60}