+impl_writeable_for_vec!(&crate::routing::router::BlindedTail);
+impl_readable_for_vec!(crate::routing::router::BlindedTail);
+
+impl Writeable for Vec<Witness> {
+ #[inline]
+ fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
+ (self.len() as u16).write(w)?;
+ for witness in self {
+ (witness.serialized_len() as u16).write(w)?;
+ witness.write(w)?;
+ }
+ Ok(())
+ }
+}
+
+impl Readable for Vec<Witness> {
+ #[inline]
+ fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
+ let num_witnesses = <u16 as Readable>::read(r)? as usize;
+ let mut witnesses = Vec::with_capacity(num_witnesses);
+ for _ in 0..num_witnesses {
+ // Even though the length of each witness can be inferred in its consensus-encoded form,
+ // the spec includes a length prefix so that implementations don't have to deserialize
+ // each initially. We do that here anyway as in general we'll need to be able to make
+ // assertions on some properties of the witnesses when receiving a message providing a list
+ // of witnesses. We'll just do a sanity check for the lengths and error if there is a mismatch.
+ let witness_len = <u16 as Readable>::read(r)? as usize;
+ let witness = <Witness as Readable>::read(r)?;
+ if witness.serialized_len() != witness_len {
+ return Err(DecodeError::BadLengthDescriptor);
+ }
+ witnesses.push(witness);
+ }
+ Ok(witnesses)
+ }
+}