Skip to content

Commit 568d006

Browse files
committed
comits: fix ReservedBytes serde deserialization
1 parent fdac879 commit 568d006

File tree

1 file changed

+23
-26
lines changed

1 file changed

+23
-26
lines changed

commit_verify/src/lib.rs

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ impl<const LEN: usize, const VAL: u8> From<[u8; LEN]> for ReservedBytes<LEN, VAL
118118
}
119119
}
120120

121+
impl<const LEN: usize, const VAL: u8> ReservedBytes<LEN, VAL> {
122+
/// Constant constructor.
123+
pub const fn new() -> Self { Self([VAL; LEN]) }
124+
}
125+
121126
mod _reserved {
122127
use strict_encoding::{DecodeError, ReadTuple, StrictDecode, TypedRead};
123128

@@ -146,46 +151,38 @@ mod _reserved {
146151

147152
#[cfg(feature = "serde")]
148153
mod _serde {
149-
use std::fmt;
150-
151-
use serde::de::Visitor;
152-
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
154+
use amplify::hex::{FromHex, ToHex};
155+
use serde::de::Error;
156+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
153157

154158
use super::*;
155159

156160
impl<const LEN: usize, const VAL: u8> Serialize for ReservedBytes<LEN, VAL> {
157161
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
158162
where S: Serializer {
159-
// Doing nothing
160-
serializer.serialize_unit()
163+
if serializer.is_human_readable() {
164+
serializer.serialize_str(&self.0.to_hex())
165+
} else {
166+
serializer.serialize_bytes(self.0.as_ref())
167+
}
161168
}
162169
}
163170

164171
impl<'de, const LEN: usize, const VAL: u8> Deserialize<'de> for ReservedBytes<LEN, VAL> {
165172
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
166173
where D: Deserializer<'de> {
167-
#[derive(Default)]
168-
pub struct UntaggedUnitVisitor;
169-
170-
impl Visitor<'_> for UntaggedUnitVisitor {
171-
type Value = ();
172-
173-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
174-
write!(formatter, "reserved unit")
175-
}
176-
177-
fn visit_none<E>(self) -> Result<(), E>
178-
where E: de::Error {
179-
Ok(())
180-
}
181-
182-
fn visit_unit<E>(self) -> Result<(), E>
183-
where E: de::Error {
184-
Ok(())
185-
}
174+
let v = if deserializer.is_human_readable() {
175+
let s = String::deserialize(deserializer)?;
176+
Vec::<u8>::from_hex(&s)
177+
.map_err(|_| D::Error::custom("invalid reserved value"))?
178+
} else {
179+
Vec::<u8>::deserialize(deserializer)?
180+
};
181+
182+
if v != [VAL; LEN] {
183+
return Err(Error::custom("invalid reserved value"));
186184
}
187185

188-
deserializer.deserialize_unit(UntaggedUnitVisitor)?;
189186
Ok(default!())
190187
}
191188
}

0 commit comments

Comments
 (0)