use super::{code::Code, data::Data, gas::Gas, info::Info, log::Log, tag::Tag};
use crate::{consensus, serializers, 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: Code,
#[serde(with = "serializers::nullable")]
pub data: Data,
pub log: Log,
pub info: Info,
#[serde(default)]
pub gas_wanted: Gas,
#[serde(default)]
pub gas_used: Gas,
pub events: Vec<Event>,
pub codespace: Codespace,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
pub struct Event {
#[serde(rename = "type")]
pub type_str: String,
pub attributes: Vec<Tag>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
pub struct BeginBlock {
#[serde(default)]
pub tags: Vec<Tag>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
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>,
}
pub 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)
}
}
impl Default for Codespace {
fn default() -> Self {
Self(String::new())
}
}