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<T: serde::Serialize>(self, p: T) -> Result<Builder<M, I>, Error> {
39 let value = serde_json::to_value(p).map_err(Error::from)?;
40 let params = Params::try_from(value)?;
41 Ok(Builder {
42 method: self.method,
43 params: Some(params),
44 id: self.id,
45 })
46 }
47
48 pub fn params_str(self, p: &str) -> Result<Builder<M, I>, Error> {
49 let params = Params::try_from(p)?;
50 Ok(Builder {
51 method: self.method,
52 params: Some(params),
53 id: self.id,
54 })
55 }
56}
57
58impl<I> Builder<MethodNone, I> {
59 pub fn method(self, m: &str) -> Builder<Method, I> {
60 Builder {
61 method: Method(m.to_string()),
62 params: self.params,
63 id: self.id,
64 }
65 }
66}
67
68impl<M> Builder<M, IdNone> {
69 pub fn id<T: Into<JId>>(self, i: T) -> Builder<M, Id> {
70 Builder {
71 method: self.method,
72 params: self.params,
73 id: Id(i.into()),
74 }
75 }
76}
77
78impl Builder<Method, Id> {
79 pub fn build(self) -> Request {
80 Request {
81 jsonrpc: "2.0".to_string(),
82 method: self.method.0,
83 params: self.params,
84 id: self.id.0,
85 }
86 }
87}