From 80b2adeb4b314261d941f062d310a495c3fe44d2 Mon Sep 17 00:00:00 2001 From: Riccardo Casatta Date: Wed, 5 Apr 2023 11:31:26 +0200 Subject: [PATCH] Make ScriptStatus Serializable it's common to cache this value client side, so making it Serializable simplify things downstream --- src/types.rs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/types.rs b/src/types.rs index 12315f5..6220e60 100644 --- a/src/types.rs +++ b/src/types.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use bitcoin::blockdata::block; use bitcoin::consensus::encode::deserialize; -use bitcoin::hashes::hex::FromHex; +use bitcoin::hashes::hex::{FromHex, ToHex}; use bitcoin::hashes::{sha256, Hash}; use bitcoin::{Script, Txid}; @@ -69,8 +69,8 @@ impl<'a> Request<'a> { } #[doc(hidden)] -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize)] -pub struct Hex32Bytes(#[serde(deserialize_with = "from_hex")] [u8; 32]); +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct Hex32Bytes(#[serde(deserialize_with = "from_hex", serialize_with = "to_hex")] [u8; 32]); impl Deref for Hex32Bytes { type Target = [u8; 32]; @@ -118,6 +118,13 @@ where T::from_hex(&s).map_err(de::Error::custom) } +fn to_hex(bytes: &[u8], serializer: S) -> std::result::Result +where + S: serde::ser::Serializer, +{ + serializer.serialize_str(&bytes.to_hex()) +} + fn from_hex_array<'de, T, D>(deserializer: D) -> Result, D::Error> where T: FromHex + std::fmt::Debug, @@ -388,3 +395,16 @@ impl From for Error { Error::Mpsc } } + +#[cfg(test)] +mod tests { + use crate::ScriptStatus; + + #[test] + fn script_status_roundtrip() { + let script_status: ScriptStatus = [1u8; 32].into(); + let script_status_json = serde_json::to_string(&script_status).unwrap(); + let script_status_back = serde_json::from_str(&script_status_json).unwrap(); + assert_eq!(script_status, script_status_back); + } +}