use serde::{Serialize, Serializer};
use types::{Bytes, U64, U256, H256, H160, H2048};
#[derive(Debug, Clone, PartialEq, Deserialize)]
pub struct Block<TX> {
pub hash: Option<H256>,
#[serde(rename="parentHash")]
pub parent_hash: H256,
#[serde(rename="sha3Uncles")]
pub uncles_hash: H256,
#[serde(rename="miner")]
pub author: H160,
#[serde(rename="stateRoot")]
pub state_root: H256,
#[serde(rename="transactionsRoot")]
pub transactions_root: H256,
#[serde(rename="receiptsRoot")]
pub receipts_root: H256,
pub number: Option<U64>,
#[serde(rename="gasUsed")]
pub gas_used: U256,
#[serde(rename="gasLimit")]
pub gas_limit: U256,
#[serde(rename="extraData")]
pub extra_data: Bytes,
#[serde(rename="logsBloom")]
pub logs_bloom: H2048,
pub timestamp: U256,
pub difficulty: U256,
#[serde(rename="totalDifficulty")]
pub total_difficulty: U256,
#[serde(rename="sealFields")]
pub seal_fields: Vec<Bytes>,
pub uncles: Vec<H256>,
pub transactions: Vec<TX>,
pub size: Option<U256>,
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum BlockNumber {
Latest,
Earliest,
Pending,
Number(u64),
}
impl From<u64> for BlockNumber {
fn from(num: u64) -> Self {
BlockNumber::Number(num)
}
}
impl Serialize for BlockNumber {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
match *self {
BlockNumber::Number(ref x) => serializer.serialize_str(&format!("0x{:x}", x)),
BlockNumber::Latest => serializer.serialize_str("latest"),
BlockNumber::Earliest => serializer.serialize_str("earliest"),
BlockNumber::Pending => serializer.serialize_str("pending"),
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum BlockId {
Hash(H256),
Number(BlockNumber),
}
impl Serialize for BlockId {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
match *self {
BlockId::Hash(ref x) => serializer.serialize_str(&format!("0x{}", x)),
BlockId::Number(ref num) => num.serialize(serializer),
}
}
}
impl From<u64> for BlockId {
fn from(num: u64) -> Self {
BlockNumber::Number(num).into()
}
}
impl From<BlockNumber> for BlockId {
fn from(num: BlockNumber) -> Self {
BlockId::Number(num)
}
}
impl From<H256> for BlockId {
fn from(hash: H256) -> Self {
BlockId::Hash(hash)
}
}