From 4167d3efa2f127231ad2f02327af3ff8eb67a3a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 29 Oct 2019 13:42:41 +0100 Subject: [PATCH] Fix `impl-serde::serializa/_raw` for empty slices --- primitive-types/impls/serde/src/serialize.rs | 30 +++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/primitive-types/impls/serde/src/serialize.rs b/primitive-types/impls/serde/src/serialize.rs index cc8da52bb..67db57b6d 100644 --- a/primitive-types/impls/serde/src/serialize.rs +++ b/primitive-types/impls/serde/src/serialize.rs @@ -40,7 +40,11 @@ fn to_hex<'a>(v: &'a mut [u8], bytes: &[u8], skip_leading_zero: bool) -> &'a str pub fn serialize_raw(slice: &mut [u8], bytes: &[u8], serializer: S) -> Result where S: Serializer, { - serializer.serialize_str(to_hex(slice, bytes, false)) + if bytes.is_empty() { + serializer.serialize_str("0x") + } else { + serializer.serialize_str(to_hex(slice, bytes, false)) + } } /// Serializes a slice of bytes. @@ -48,7 +52,7 @@ pub fn serialize(bytes: &[u8], serializer: S) -> Result wher S: Serializer, { let mut slice = vec![0u8; (bytes.len() + 1) * 2]; - serializer.serialize_str(to_hex(&mut *slice, bytes, false)) + serialize_raw(&mut slice, bytes, serializer) } /// Serialize a slice of bytes as uint. @@ -60,10 +64,10 @@ pub fn serialize_uint(slice: &mut [u8], bytes: &[u8], serializer: S) -> Resul let non_zero = bytes.iter().take_while(|b| **b == 0).count(); let bytes = &bytes[non_zero..]; if bytes.is_empty() { - return serializer.serialize_str("0x0"); + serializer.serialize_str("0x0") + } else { + serializer.serialize_str(to_hex(slice, bytes, true)) } - - serializer.serialize_str(to_hex(slice, bytes, true)) } /// Expected length of bytes vector. @@ -222,9 +226,9 @@ pub fn deserialize_check_len<'a, 'de, D>(deserializer: D, len: ExpectedLen<'a>) mod tests { extern crate serde_derive; - use self::serde_derive::Deserialize; + use self::serde_derive::{Serialize, Deserialize}; - #[derive(Deserialize)] + #[derive(Serialize, Deserialize)] struct Bytes(#[serde(with="super")] Vec); #[test] @@ -255,4 +259,16 @@ mod tests { assert_eq!(b.0.len(), 32); assert_eq!(c.0.len(), 32); } + + #[test] + fn should_serialize_and_deserialize_empty_bytes() { + let bytes = Bytes(Vec::new()); + + let data = serde_json::to_string(&bytes).unwrap(); + + assert_eq!("\"0x\"", &data); + + let deserialized: Bytes = serde_json::from_str(&data).unwrap(); + assert!(deserialized.0.is_empty()) + } }