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}