use serde::{Deserialize, Serialize};
use tendermint::{
block::{self, Block},
Hash,
};
use crate::dialect::{self, Dialect};
use crate::request::RequestMessage;
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct Request {
#[serde(default)]
#[serde(with = "crate::serializers::opt_tm_hash_base64")]
pub hash: Option<Hash>,
}
impl Request {
pub fn new<H: Into<Hash>>(hash: H) -> Self {
Self {
hash: Some(hash.into()),
}
}
}
impl RequestMessage for Request {
fn method(&self) -> crate::Method {
crate::Method::BlockByHash
}
}
impl crate::Request<dialect::v0_34::Dialect> for Request {
type Response = Response;
}
impl crate::Request<dialect::v0_37::Dialect> for Request {
type Response = Response;
}
impl crate::Request<dialect::v0_38::Dialect> for Request {
type Response = self::v0_38::DialectResponse;
}
impl<S: Dialect> crate::SimpleRequest<S> for Request
where
Self: crate::Request<S>,
Response: From<Self::Response>,
{
type Output = Response;
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Response {
pub block_id: block::Id,
pub block: Option<Block>,
}
impl crate::Response for Response {}
pub mod v0_38 {
use super::*;
use crate::endpoint::block::v0_38::DialectBlock;
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct DialectResponse {
pub block_id: block::Id,
pub block: Option<DialectBlock>,
}
impl crate::Response for DialectResponse {}
impl From<DialectResponse> for Response {
fn from(msg: DialectResponse) -> Self {
Self {
block_id: msg.block_id,
block: msg.block.map(Into::into),
}
}
}
}