Skip to main content

jrpc_types/request/
builder.rs

1//! This module implements a Builder class for the Request object.
2
3use crate::{error::Error, id::Id as JId, params::Params, request::Request};
4
5// =======================
6// Type State Structs
7// =======================
8pub struct MethodNone;
9pub struct Method(String);
10pub struct IdNone;
11pub struct Id(JId);
12// =======================
13
14/// The Builder class for a Request object.
15pub 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}