@@ -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+
121126mod _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