From 378221a4240ef8b55d7a082422b9ece8e47e8cdd Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 28 Dec 2020 18:27:05 +0100 Subject: [PATCH] Deserialize decimal inputs on BlockNumber (#254) --- client/rpc-core/src/types/block_number.rs | 34 +++++++++++++++++++++-- client/rpc-core/src/types/index.rs | 10 +++++-- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/client/rpc-core/src/types/block_number.rs b/client/rpc-core/src/types/block_number.rs index e2e01c604..116ea48d5 100644 --- a/client/rpc-core/src/types/block_number.rs +++ b/client/rpc-core/src/types/block_number.rs @@ -142,13 +142,41 @@ impl<'a> Visitor<'a> for BlockNumberVisitor { _ if value.starts_with("0x") => u64::from_str_radix(&value[2..], 16).map(BlockNumber::Num).map_err(|e| { Error::custom(format!("Invalid block number: {}", e)) }), - _ => { - Err(Error::custom("Invalid block number: missing 0x prefix".to_string())) - }, + _ => u64::from_str_radix(&value, 10).map(BlockNumber::Num).map_err(|_| { + Error::custom("Invalid block number: non-decimal or missing 0x prefix".to_string()) + }), } } fn visit_string(self, value: String) -> Result where E: Error { self.visit_str(value.as_ref()) } + + fn visit_u64(self, value: u64) -> Result where E: Error { + Ok(BlockNumber::Num(value)) + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + fn match_block_number(block_number: BlockNumber) -> Option { + match block_number { + BlockNumber::Num(number) => Some(number), + _ => None + } + } + + #[test] + fn block_number_deserialize() { + let bn_dec: BlockNumber = serde_json::from_str(r#""42""#).unwrap(); + let bn_hex: BlockNumber = serde_json::from_str(r#""0x45""#).unwrap(); + let bn_u64: BlockNumber = serde_json::from_str(r#"420"#).unwrap(); + + assert_eq!(match_block_number(bn_dec).unwrap(), 42 as u64); + assert_eq!(match_block_number(bn_hex).unwrap(), 69 as u64); + assert_eq!(match_block_number(bn_u64).unwrap(), 420 as u64); + } } diff --git a/client/rpc-core/src/types/index.rs b/client/rpc-core/src/types/index.rs index 80c5a7542..3b18082b9 100644 --- a/client/rpc-core/src/types/index.rs +++ b/client/rpc-core/src/types/index.rs @@ -61,6 +61,10 @@ impl<'a> Visitor<'a> for IndexVisitor { fn visit_string(self, value: String) -> Result where E: Error { self.visit_str(value.as_ref()) } + + fn visit_u64(self, value: u64) -> Result where E: Error { + Ok(Index(value as usize)) + } } #[cfg(test)] @@ -69,9 +73,9 @@ mod tests { use serde_json; #[test] - fn block_number_deserialization() { - let s = r#"["0xa", "10"]"#; + fn index_deserialization() { + let s = r#"["0xa", "10", 42]"#; let deserialized: Vec = serde_json::from_str(s).unwrap(); - assert_eq!(deserialized, vec![Index(10), Index(10)]); + assert_eq!(deserialized, vec![Index(10), Index(10), Index(42)]); } }