use super::{code::Code, data::Data, gas::Gas, info::Info, log::Log, tag::Tag};
use crate::{consensus, validator};
use serde::{Deserialize, Deserializer, Serialize};
use std::fmt::{self, Display};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Responses {
#[serde(alias = "DeliverTx")]
#[serde(default, deserialize_with = "deserialize_deliver_tx")]
pub deliver_tx: Vec<DeliverTx>,
#[serde(alias = "BeginBlock")]
pub begin_block: Option<BeginBlock>,
#[serde(alias = "EndBlock")]
pub end_block: Option<EndBlock>,
}
fn deserialize_deliver_tx<'de, D>(deserializer: D) -> Result<Vec<DeliverTx>, D::Error>
where
D: Deserializer<'de>,
{
Ok(Option::deserialize(deserializer)?.unwrap_or_default())
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct DeliverTx {
pub code: Option<Code>,
pub data: Option<Data>,
pub log: Option<Log>,
pub info: Option<Info>,
#[serde(default, rename = "gasWanted")]
pub gas_wanted: Gas,
#[serde(default, rename = "gasUsed")]
pub gas_used: Gas,
#[serde(default)]
pub tags: Vec<Tag>,
pub codespace: Option<Codespace>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct BeginBlock {
#[serde(default)]
pub tags: Vec<Tag>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EndBlock {
#[serde(deserialize_with = "deserialize_validator_updates")]
pub validator_updates: Vec<validator::Update>,
pub consensus_param_updates: Option<consensus::Params>,
#[serde(default)]
pub tags: Vec<Tag>,
}
fn deserialize_validator_updates<'de, D>(
deserializer: D,
) -> Result<Vec<validator::Update>, D::Error>
where
D: Deserializer<'de>,
{
Ok(Option::deserialize(deserializer)?.unwrap_or_default())
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct Codespace(String);
impl AsRef<str> for Codespace {
fn as_ref(&self) -> &str {
self.0.as_ref()
}
}
impl Display for Codespace {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}