thin_jsonrpc_client/
params.rs1use serde_json::value::RawValue;
2use serde::Serialize;
3
4pub trait IntoRpcParams {
7 fn into_rpc_params(self) -> RpcParams;
11}
12
13pub type RpcParams = Option<Box<RawValue>>;
15
16impl IntoRpcParams for RpcParams {
17 fn into_rpc_params(self) -> RpcParams {
18 self
19 }
20}
21
22#[derive(Clone, Debug)]
38pub struct ObjectParams {
39 bytes: Vec<u8>
40}
41
42impl ObjectParams {
43 pub fn new() -> Self {
45 ObjectParams { bytes: Vec::new() }
46 }
47
48 pub fn insert<P: Serialize>(mut self, name: &str, value: P) -> Self {
50 if self.bytes.is_empty() {
51 self.bytes.push(b'{');
52 } else {
53 self.bytes.push(b',');
54 }
55
56 serde_json::to_writer(&mut self.bytes, name)
57 .expect("should always be valid");
58 self.bytes.push(b':');
59 serde_json::to_writer(&mut self.bytes, &value)
60 .expect("invalid JSON");
61
62 self
63 }
64}
65
66impl IntoRpcParams for ObjectParams {
67 fn into_rpc_params(mut self) -> RpcParams {
68 if self.bytes.is_empty() {
69 return None;
70 }
71
72 self.bytes.push(b'}');
73 let utf8_string = unsafe { String::from_utf8_unchecked(self.bytes) };
75 Some(RawValue::from_string(utf8_string).expect("valid JSON expected"))
76 }
77}
78
79#[derive(Clone, Debug)]
95pub struct ArrayParams {
96 bytes: Vec<u8>
97}
98
99impl ArrayParams {
100 pub fn new() -> Self {
102 ArrayParams { bytes: Vec::new() }
103 }
104
105 pub fn insert<P: Serialize>(mut self, value: P) -> Self {
107 if self.bytes.is_empty() {
108 self.bytes.push(b'[');
109 } else {
110 self.bytes.push(b',');
111 }
112
113 serde_json::to_writer(&mut self.bytes, &value)
114 .expect("invalid JSON");
115
116 self
117 }
118}
119
120impl IntoRpcParams for ArrayParams {
121 fn into_rpc_params(mut self) -> RpcParams {
122 if self.bytes.is_empty() {
123 return None;
124 }
125
126 self.bytes.push(b']');
127 let utf8_string = unsafe { String::from_utf8_unchecked(self.bytes) };
129 Some(RawValue::from_string(utf8_string).expect("valid JSON expected"))
130 }
131}
132
133#[macro_export]
135macro_rules! params {
136 ($($param:expr),*) => {{
137 let mut a = $crate::params::ArrayParams::new();
138 $(
139 a = a.insert($param);
140 )*
141 a
142 }}
143}
144pub use params;
145
146impl <const N: usize, P: Serialize> IntoRpcParams for [P; N] {
148 fn into_rpc_params(self) -> RpcParams {
149 let mut params = ArrayParams::new();
150 for p in self {
151 params = params.insert(p)
152 }
153 params.into_rpc_params()
154 }
155}
156
157macro_rules! impl_tuple_params {
159 ($($ident:ident)*) => {
160 impl <$($ident),*> IntoRpcParams for ($($ident,)*)
161 where $($ident: Serialize),*
162 {
163 #[allow(non_snake_case, unused_mut)]
164 fn into_rpc_params(self) -> RpcParams {
165 let ($($ident,)*) = self;
166 let mut params = ArrayParams::new();
167 $(
168 params = params.insert($ident);
169 )*
170 params.into_rpc_params()
171 }
172 }
173 }
174}
175
176impl_tuple_params!();
177impl_tuple_params!(A);
178impl_tuple_params!(A B);
179impl_tuple_params!(A B C);
180impl_tuple_params!(A B C D);
181impl_tuple_params!(A B C D E);
182impl_tuple_params!(A B C D E F);
183impl_tuple_params!(A B C D E F G);
184impl_tuple_params!(A B C D E F G H);
185impl_tuple_params!(A B C D E F G H I);
186impl_tuple_params!(A B C D E F G H I J);
187impl_tuple_params!(A B C D E F G H I J K);
188impl_tuple_params!(A B C D E F G H I J K L);
189impl_tuple_params!(A B C D E F G H I J K L M);
190impl_tuple_params!(A B C D E F G H I J K L M N);
191impl_tuple_params!(A B C D E F G H I J K L M N O);
192impl_tuple_params!(A B C D E F G H I J K L M N O P);