1#![doc = include_str!("../README.md")]
2
3use std::error::Error as StdError;
4use std::fmt::{Display, Formatter};
5
6pub use serde;
7use serde::de::{Error as SerdeError, Unexpected};
8use serde::{Deserialize, Deserializer, Serialize, Serializer};
9pub use serde_json;
10use serde_json::value::RawValue;
11use serde_json::Value;
12
13pub use container::Container;
14pub use registry::*;
15
16pub use rustic_jsonrpc_macro::method;
18
19pub use rustic_jsonrpc_macro::method_ident;
21
22#[macro_export]
24macro_rules! methods {
25 ($($name:ident),+ $(,)?) => {
26 &[$(rustic_jsonrpc::method_ident!($name)),*]
27 };
28}
29
30mod container;
31mod registry;
32
33const PARSE_ERROR: i32 = -32700;
35
36const METHOD_NOT_FOUND: i32 = -32601;
38
39pub const INVALID_PARAMS: i32 = -32602;
41
42const SERVER_ERROR: i32 = -32000;
44
45#[derive(Deserialize, Debug)]
47pub struct Request<'a> {
48 #[allow(dead_code)]
50 jsonrpc: V2_0,
51
52 pub method: &'a str,
54
55 #[serde(borrow)]
57 pub params: Option<&'a RawValue>,
58 #[serde(borrow, default)]
59
60 pub id: Id<'a>,
62}
63
64#[derive(Serialize, Debug)]
66pub struct Response<'a> {
67 jsonrpc: V2_0,
69
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub result: Option<Value>,
73
74 #[serde(skip_serializing_if = "Option::is_none")]
76 pub error: Option<Error>,
77
78 pub id: Id<'a>,
80}
81
82impl<'a> Response<'a> {
83 pub fn result(result: Value, id: Id<'a>) -> Self {
85 Self {
86 jsonrpc: V2_0,
87 result: Some(result),
88 error: None,
89 id,
90 }
91 }
92
93 pub fn error(err: Error, id: Id<'a>) -> Self {
95 Self {
96 jsonrpc: V2_0,
97 result: None,
98 error: Some(err),
99 id,
100 }
101 }
102}
103
104#[derive(Serialize, Debug, Clone)]
106pub struct Error {
107 pub code: i32,
109
110 pub message: String,
112
113 pub data: Option<Value>,
115}
116
117impl Display for Error {
118 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
119 f.write_str(&self.message)
120 }
121}
122
123impl StdError for Error {}
124
125impl Error {
126 pub fn new(code: i32, message: impl ToString, data: Option<Value>) -> Self {
128 Self {
129 code,
130 message: message.to_string(),
131 data,
132 }
133 }
134
135 pub fn cast<'a>(err: &'a (dyn StdError + 'static)) -> Option<&'a Self> {
137 match err.downcast_ref() {
138 Some(v) => return Some(v),
139 None => (),
140 };
141
142 let mut err: &(dyn StdError + 'static) = err;
143 while let Some(e) = err.source() {
144 match e.downcast_ref::<Self>() {
145 Some(e) => return Some(e),
146 None => err = e,
147 }
148 }
149 None
150 }
151}
152
153#[derive(Copy, Clone, Debug)]
155struct V2_0;
156
157impl Serialize for V2_0 {
158 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
159 where
160 S: Serializer,
161 {
162 serializer.serialize_str("2.0")
163 }
164}
165
166impl<'a> Deserialize<'a> for V2_0 {
167 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
168 where
169 D: Deserializer<'a>,
170 {
171 match <&str as Deserialize>::deserialize(deserializer)? {
172 "2.0" => Ok(V2_0),
173 v => Err(SerdeError::invalid_value(Unexpected::Str(v), &"\"2.0\"")),
174 }
175 }
176}
177
178#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
180#[serde(untagged)]
181pub enum Id<'a> {
182 Str(&'a str),
184
185 Int(i64),
187
188 Null,
190
191 None,
193}
194
195impl<'a> Default for Id<'a> {
196 fn default() -> Self {
197 Self::None
198 }
199}