feat: impl Deserialize for block number (#497)
This commit is contained in:
parent
6216b2e4a2
commit
2255b877de
|
@ -1,6 +1,7 @@
|
||||||
// Taken from https://github.com/tomusdrw/rust-web3/blob/master/src/types/block.rs
|
// Taken from https://github.com/tomusdrw/rust-web3/blob/master/src/types/block.rs
|
||||||
use crate::types::{Address, Bloom, Bytes, H256, U256, U64};
|
use crate::types::{Address, Bloom, Bytes, H256, U256, U64};
|
||||||
use serde::{ser::SerializeStruct, Deserialize, Serialize, Serializer};
|
use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer};
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
/// The block type returned from RPC calls.
|
/// The block type returned from RPC calls.
|
||||||
/// This is generic over a `TX` type which will be either the hash or the
|
/// This is generic over a `TX` type which will be either the hash or the
|
||||||
|
@ -192,12 +193,46 @@ impl Serialize for BlockNumber {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for BlockNumber {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let s = String::deserialize(deserializer)?.to_lowercase();
|
||||||
|
Ok(match s.as_str() {
|
||||||
|
"latest" => Self::Latest,
|
||||||
|
"earliest" => Self::Earliest,
|
||||||
|
"pending" => Self::Pending,
|
||||||
|
n => BlockNumber::Number(U64::from_str(n).map_err(serde::de::Error::custom)?),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
#[cfg(not(feature = "celo"))]
|
#[cfg(not(feature = "celo"))]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::types::{Transaction, TxHash};
|
use crate::types::{Transaction, TxHash};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serde_block_number() {
|
||||||
|
for b in vec![
|
||||||
|
BlockNumber::Latest,
|
||||||
|
BlockNumber::Earliest,
|
||||||
|
BlockNumber::Pending,
|
||||||
|
] {
|
||||||
|
let b_ser = serde_json::to_string(&b).unwrap();
|
||||||
|
let b_de: BlockNumber = serde_json::from_str(&b_ser).unwrap();
|
||||||
|
assert_eq!(b_de, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
let b = BlockNumber::Number(1042u64.into());
|
||||||
|
let b_ser = serde_json::to_string(&b).unwrap();
|
||||||
|
let b_de: BlockNumber = serde_json::from_str(&b_ser).unwrap();
|
||||||
|
assert_eq!(b_ser, "\"0x412\"");
|
||||||
|
assert_eq!(b_de, b);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn deserialize_blk_no_txs() {
|
fn deserialize_blk_no_txs() {
|
||||||
let block = r#"{"number":"0x3","hash":"0xda53da08ef6a3cbde84c33e51c04f68c3853b6a3731f10baa2324968eee63972","parentHash":"0x689c70c080ca22bc0e681694fa803c1aba16a69c8b6368fed5311d279eb9de90","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","transactionsRoot":"0x7270c1c4440180f2bd5215809ee3d545df042b67329499e1ab97eb759d31610d","stateRoot":"0x29f32984517a7d25607da485b23cefabfd443751422ca7e603395e1de9bc8a4b","receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2","miner":"0x0000000000000000000000000000000000000000","difficulty":"0x0","totalDifficulty":"0x0","extraData":"0x","size":"0x3e8","gasLimit":"0x6691b7","gasUsed":"0x5208","timestamp":"0x5ecedbb9","transactions":["0xc3c5f700243de37ae986082fd2af88d2a7c2752a0c0f7b9d6ac47c729d45e067"],"uncles":[]}"#;
|
let block = r#"{"number":"0x3","hash":"0xda53da08ef6a3cbde84c33e51c04f68c3853b6a3731f10baa2324968eee63972","parentHash":"0x689c70c080ca22bc0e681694fa803c1aba16a69c8b6368fed5311d279eb9de90","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","transactionsRoot":"0x7270c1c4440180f2bd5215809ee3d545df042b67329499e1ab97eb759d31610d","stateRoot":"0x29f32984517a7d25607da485b23cefabfd443751422ca7e603395e1de9bc8a4b","receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2","miner":"0x0000000000000000000000000000000000000000","difficulty":"0x0","totalDifficulty":"0x0","extraData":"0x","size":"0x3e8","gasLimit":"0x6691b7","gasUsed":"0x5208","timestamp":"0x5ecedbb9","transactions":["0xc3c5f700243de37ae986082fd2af88d2a7c2752a0c0f7b9d6ac47c729d45e067"],"uncles":[]}"#;
|
||||||
|
|
Loading…
Reference in New Issue