use serde::{Deserialize, Serialize};
use crate::neo_types::{
deserialize_h256, deserialize_h256_option, serialize_h256, serialize_h256_option, H256,
};
#[allow(dead_code)]
pub(crate) trait TXTrait {
fn hash(&self) -> H256;
}
#[allow(dead_code)]
impl TXTrait for H256 {
fn hash(&self) -> H256 {
*self
}
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[allow(dead_code)]
pub(crate) struct Block<TX, W> {
#[serde(serialize_with = "serialize_h256")]
#[serde(deserialize_with = "deserialize_h256")]
pub hash: H256,
pub size: u32,
pub version: u32,
#[serde(rename = "previousblockhash")]
#[serde(serialize_with = "serialize_h256")]
#[serde(deserialize_with = "deserialize_h256")]
pub prev_block_hash: H256,
#[serde(rename = "merkleroot")]
#[serde(serialize_with = "serialize_h256")]
#[serde(deserialize_with = "deserialize_h256")]
pub merkle_root_hash: H256,
pub time: u32,
pub index: u32,
pub primary: Option<u32>,
#[serde(rename = "nextconsensus")]
pub next_consensus: String,
pub witnesses: Option<Vec<W>>,
#[serde(rename = "tx")]
pub transactions: Option<Vec<TX>>,
pub confirmations: u32,
#[serde(rename = "nextblockhash")]
#[serde(serialize_with = "serialize_h256_option")]
#[serde(deserialize_with = "deserialize_h256_option")]
pub next_block_hash: Option<H256>,
}
#[allow(dead_code)]
impl<TX, W> PartialEq for Block<TX, W>
where
TX: TXTrait,
{
fn eq(&self, other: &Self) -> bool {
if let (Some(tx), Some(other_tx)) = (&self.transactions, &other.transactions) {
if tx.len() != other_tx.len() {
return false;
}
for (lhs, rhs) in tx.iter().zip(other_tx) {
if lhs.hash() != rhs.hash() {
return false;
}
}
}
self.hash == other.hash
}
}