use serde::{Deserialize, Serialize};
use tendermint::{abci::Code, block, merkle::proof::ProofOps, serializers};
use crate::prelude::*;
use crate::{dialect::Dialect, request::RequestMessage};
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Request {
#[serde(skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
#[serde(with = "serializers::bytes::hexstring")]
pub data: Vec<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<block::Height>,
#[serde(default)]
pub prove: bool,
}
impl Request {
pub fn new<D>(path: Option<String>, data: D, height: Option<block::Height>, prove: bool) -> Self
where
D: Into<Vec<u8>>,
{
Self {
path,
data: data.into(),
height,
prove,
}
}
}
impl RequestMessage for Request {
fn method(&self) -> crate::Method {
crate::Method::AbciQuery
}
}
impl<S: Dialect> crate::Request<S> for Request {
type Response = Response;
}
impl<S: Dialect> crate::SimpleRequest<S> for Request {
type Output = Response;
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub struct Response {
pub response: AbciQuery,
}
impl crate::Response for Response {}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default)]
#[serde(default)]
pub struct AbciQuery {
pub code: Code,
pub log: String,
#[serde(default = "String::new")]
pub info: String,
#[serde(with = "serializers::from_str")]
pub index: i64,
#[serde(default, with = "serializers::bytes::base64string")]
pub key: Vec<u8>,
#[serde(default, with = "serializers::bytes::base64string")]
pub value: Vec<u8>,
#[serde(alias = "proofOps")]
pub proof: Option<ProofOps>,
pub height: block::Height,
#[serde(default = "String::new")]
pub codespace: String,
}