From fadd36891168933afa2abff5f1656bac13b8cc5f Mon Sep 17 00:00:00 2001 From: Riccardo Casatta Date: Mon, 26 Apr 2021 11:52:19 +0200 Subject: [PATCH] use different ser/de for Script in case of non human readable format --- src/blockdata/script.rs | 77 +++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/src/blockdata/script.rs b/src/blockdata/script.rs index 12844498..17a2e7c6 100644 --- a/src/blockdata/script.rs +++ b/src/blockdata/script.rs @@ -819,44 +819,59 @@ impl_index_newtype!(Builder, u8); #[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for Script { fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, + where D: serde::Deserializer<'de>, { use core::fmt::Formatter; use hashes::hex::FromHex; - struct Visitor; - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = Script; + if deserializer.is_human_readable() { - fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { - formatter.write_str("a script") - } + struct Visitor; + impl<'de> serde::de::Visitor<'de> for Visitor { + type Value = Script; - fn visit_str(self, v: &str) -> Result - where - E: serde::de::Error, - { - let v = Vec::from_hex(v).map_err(E::custom)?; - Ok(Script::from(v)) - } + fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { + formatter.write_str("a script hex") + } - fn visit_borrowed_str(self, v: &'de str) -> Result - where - E: serde::de::Error, - { - self.visit_str(v) - } + fn visit_str(self, v: &str) -> Result + where E: serde::de::Error, + { + let v = Vec::from_hex(v).map_err(E::custom)?; + Ok(Script::from(v)) + } - fn visit_string(self, v: String) -> Result - where - E: serde::de::Error, - { - self.visit_str(&v) + fn visit_borrowed_str(self, v: &'de str) -> Result + where E: serde::de::Error, + { + self.visit_str(v) + } + + fn visit_string(self, v: String) -> Result + where E: serde::de::Error, + { + self.visit_str(&v) + } } + deserializer.deserialize_str(Visitor) + } else { + struct BytesVisitor; + + impl<'de> serde::de::Visitor<'de> for BytesVisitor { + type Value = Script; + + fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { + formatter.write_str("a script Vec") + } + + fn visit_bytes(self, v: &[u8]) -> Result + where E: serde::de::Error, + { + Ok(Script::from(v.to_vec())) + } + } + deserializer.deserialize_bytes(BytesVisitor) } - - deserializer.deserialize_str(Visitor) } } @@ -867,7 +882,11 @@ impl serde::Serialize for Script { where S: serde::Serializer, { - serializer.serialize_str(&format!("{:x}", self)) + if serializer.is_human_readable() { + serializer.serialize_str(&format!("{:x}", self)) + } else { + serializer.serialize_bytes(&self.as_bytes()) + } } }