tendermint_rpc/
request.rs1use core::fmt::Debug;
4
5use serde::{de::DeserializeOwned, Deserialize, Serialize};
6
7use super::{Id, Method, Version};
8use crate::dialect::{Dialect, LatestDialect};
9use crate::{prelude::*, Error};
10
11pub trait RequestMessage: DeserializeOwned + Serialize + Sized {
13 fn method(&self) -> Method;
15
16 fn into_json(self) -> String {
18 Wrapper::new(self).into_json()
19 }
20
21 fn from_string(s: impl AsRef<[u8]>) -> Result<Self, Error> {
23 let wrapper: Wrapper<Self> = serde_json::from_slice(s.as_ref()).map_err(Error::serde)?;
24 Ok(wrapper.params)
25 }
26}
27
28pub trait Request<S: Dialect = LatestDialect>: RequestMessage + Send {
30 type Response: super::response::Response;
32}
33
34pub trait SimpleRequest<S: Dialect = LatestDialect>: Request<S> {
43 type Output: From<Self::Response>;
45}
46
47#[derive(Debug, Deserialize, Serialize)]
49pub struct Wrapper<R> {
50 jsonrpc: Version,
52
53 id: Id,
55
56 method: Method,
58
59 params: R,
61}
62
63impl<R> Wrapper<R>
64where
65 R: RequestMessage,
66{
67 pub fn new(request: R) -> Self {
73 Self::new_with_id(Id::uuid_v4(), request)
74 }
75
76 pub(crate) fn new_with_id(id: Id, request: R) -> Self {
77 Self {
78 jsonrpc: Version::current(),
79 id,
80 method: request.method(),
81 params: request,
82 }
83 }
84
85 pub fn id(&self) -> &Id {
86 &self.id
87 }
88
89 pub fn params(&self) -> &R {
90 &self.params
91 }
92
93 pub fn into_json(self) -> String {
94 serde_json::to_string_pretty(&self).unwrap()
95 }
96}