From 971eabf4c2e0506639df6fa18bca2c6c30195c3a Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Thu, 6 May 2021 09:30:15 +1000 Subject: [PATCH] Replace custom "bytes" serde module with serde_with's `TryFromInto` --- Cargo.lock | 73 ++++++++++++++++++++++++++++++++++++++- monero-rpc/Cargo.toml | 1 + monero-rpc/src/monerod.rs | 65 +++++----------------------------- 3 files changed, 81 insertions(+), 58 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 89861f7d..df1601ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -611,7 +611,7 @@ dependencies = [ "ansi_term 0.11.0", "atty", "bitflags", - "strsim", + "strsim 0.8.0", "textwrap", "unicode-width", "vec_map", @@ -807,6 +807,41 @@ dependencies = [ "zeroize", ] +[[package]] +name = "darling" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.24", + "quote 1.0.9", + "strsim 0.10.0", + "syn 1.0.64", +] + +[[package]] +name = "darling_macro" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" +dependencies = [ + "darling_core", + "quote 1.0.9", + "syn 1.0.64", +] + [[package]] name = "data-encoding" version = "2.3.2" @@ -1492,6 +1527,12 @@ dependencies = [ "webpki", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.1.5" @@ -2210,6 +2251,7 @@ dependencies = [ "reqwest", "serde", "serde_json", + "serde_with", "tokio", "tracing", ] @@ -3362,6 +3404,29 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edeeaecd5445109b937a3a335dc52780ca7779c4b4b7374cc6340dedfe44cfca" +dependencies = [ + "rustversion", + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48b35457e9d855d3dc05ef32a73e0df1e2c0fd72c38796a4ee909160c8eeec2" +dependencies = [ + "darling", + "proc-macro2 1.0.24", + "quote 1.0.9", + "syn 1.0.64", +] + [[package]] name = "serial_test" version = "0.4.0" @@ -3668,6 +3733,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "structopt" version = "0.3.21" diff --git a/monero-rpc/Cargo.toml b/monero-rpc/Cargo.toml index 54b3d64c..5bb24e7b 100644 --- a/monero-rpc/Cargo.toml +++ b/monero-rpc/Cargo.toml @@ -15,6 +15,7 @@ rand = "0.7" reqwest = { version = "0.11", default-features = false, features = [ "json" ] } serde = { version = "1.0", features = [ "derive" ] } serde_json = "1.0" +serde_with = "1.9" tracing = "0.1" [dev-dependencies] diff --git a/monero-rpc/src/monerod.rs b/monero-rpc/src/monerod.rs index bf917a1a..6eb0ad22 100644 --- a/monero-rpc/src/monerod.rs +++ b/monero-rpc/src/monerod.rs @@ -1,6 +1,7 @@ use anyhow::{Context, Result}; use monero::{cryptonote::hash::Hash, util::ringct, PublicKey}; -use serde::{de::DeserializeOwned, Deserialize, Serialize, Serializer}; +use serde::{de::DeserializeOwned, Deserialize, Serialize}; +use serde_with::{serde_as, TryFromInto}; #[jsonrpc_client::api(version = "2.0")] pub trait MonerodRpc { @@ -118,9 +119,10 @@ pub struct GetIndexesResponse { pub o_indexes: Vec, } +#[serde_as] #[derive(Clone, Debug, Serialize)] struct GetOIndexesPayload { - #[serde(with = "byte_array")] + #[serde_as(as = "TryFromInto<[u8; 32]>")] txid: Hash, } @@ -142,14 +144,15 @@ pub struct GetOutsResponse { pub outs: Vec, } +#[serde_as] #[derive(Clone, Copy, Debug, Deserialize, PartialEq)] pub struct OutKey { pub height: u64, - #[serde(with = "byte_array")] + #[serde_as(as = "TryFromInto<[u8; 32]>")] pub key: PublicKey, - #[serde(with = "byte_array")] + #[serde_as(as = "TryFromInto<[u8; 32]>")] pub mask: ringct::Key, - #[serde(with = "byte_array")] + #[serde_as(as = "TryFromInto<[u8; 32]>")] pub txid: Hash, pub unlocked: bool, } @@ -198,55 +201,3 @@ mod monero_serde_hex_block { Ok(block) } } - -mod byte_array { - use super::*; - use serde::{de::Error, Deserializer}; - use std::{convert::TryFrom, fmt, marker::PhantomData}; - - pub fn serialize(bytes: B, serializer: S) -> Result - where - S: Serializer, - B: AsRef<[u8]>, - { - serializer.serialize_bytes(bytes.as_ref()) - } - - pub fn deserialize<'de, D, B, const N: usize>(deserializer: D) -> Result - where - D: Deserializer<'de>, - B: TryFrom<[u8; N]>, - { - struct Visitor { - phantom: PhantomData<(T, [u8; N])>, - } - - impl<'de, T, const N: usize> serde::de::Visitor<'de> for Visitor - where - T: TryFrom<[u8; N]>, - { - type Value = T; - - fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "a byte buffer") - } - - fn visit_byte_buf(self, v: Vec) -> Result - where - E: Error, - { - let bytes = <[u8; N]>::try_from(v).map_err(|_| { - E::custom(format!("Failed to construct [u8; {}] from buffer", N)) - })?; - let result = T::try_from(bytes) - .map_err(|_| E::custom(format!("Failed to construct T from [u8; {}]", N)))?; - - Ok(result) - } - } - - deserializer.deserialize_byte_buf(Visitor { - phantom: PhantomData, - }) - } -}