jrpc_types/request/
builder.rs1use crate::{error::Error, id::Id as JId, params::Params, request::Request};
4
5pub struct MethodNone;
9pub struct Method(String);
10pub struct IdNone;
11pub struct Id(JId);
12pub struct Builder<M, I> {
16 method: M,
17 params: Option<Params>,
18 id: I,
19}
20
21impl Default for Builder<MethodNone, IdNone> {
22 fn default() -> Self {
23 Self::new()
24 }
25}
26
27impl Builder<MethodNone, IdNone> {
28 pub fn new() -> Self {
29 Builder {
30 method: MethodNone,
31 params: None,
32 id: IdNone,
33 }
34 }
35}
36
37impl<M, I> Builder<M, I> {
38 pub fn params(self, p: serde_json::Value) -> Result<Builder<M, I>, Error> {
39 Ok(Builder {
40 method: self.method,
41 params: Some(Params::try_from(p)?),
42 id: self.id,
43 })
44 }
45
46 pub fn params_serialize<T: serde::Serialize>(self, p: T) -> Result<Builder<M, I>, Error> {
47 let value = serde_json::to_value(p).map_err(Error::from)?;
48 let params = Params::try_from(value)?;
49 Ok(Builder {
50 method: self.method,
51 params: Some(params),
52 id: self.id,
53 })
54 }
55
56 pub fn params_str(self, p: &str) -> Result<Builder<M, I>, Error> {
57 let params = Params::try_from(p)?;
58 Ok(Builder {
59 method: self.method,
60 params: Some(params),
61 id: self.id,
62 })
63 }
64}
65
66impl<I> Builder<MethodNone, I> {
67 pub fn method(self, m: &str) -> Builder<Method, I> {
68 Builder {
69 method: Method(m.to_string()),
70 params: self.params,
71 id: self.id,
72 }
73 }
74}
75
76impl<M> Builder<M, IdNone> {
77 pub fn id<T: Into<JId>>(self, i: T) -> Builder<M, Id> {
78 Builder {
79 method: self.method,
80 params: self.params,
81 id: Id(i.into()),
82 }
83 }
84}
85
86impl Builder<Method, Id> {
87 pub fn build(self) -> Request {
88 Request {
89 jsonrpc: "2.0".to_string(),
90 method: self.method.0,
91 params: self.params,
92 id: self.id.0,
93 }
94 }
95}