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<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}