From 71312b032a9ea0cdded5543663b6842d71e76bb1 Mon Sep 17 00:00:00 2001 From: Andrew Poelstra Date: Thu, 4 Sep 2014 20:09:18 -0500 Subject: [PATCH] Impl encodable/decodable for the array newtypes --- src/macros.rs | 29 +++++++++++++++++++++++++++++ src/secp256k1.rs | 3 +++ 2 files changed, 32 insertions(+) diff --git a/src/macros.rs b/src/macros.rs index a5f1133..da15704 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -89,6 +89,35 @@ macro_rules! impl_array_newtype( } } } + + impl, E> ::serialize::Decodable for $thing { + fn decode(d: &mut D) -> ::std::prelude::Result<$thing, E> { + use serialize::Decodable; + + ::assert_type_is_copy::<$ty>(); + + d.read_seq(|d, len| { + if len != $len { + Err(d.error("Invalid length")) + } else { + unsafe { + use std::mem; + let mut ret: [$ty, ..$len] = mem::uninitialized(); + for i in range(0, len) { + ret[i] = try!(d.read_seq_elt(i, |d| Decodable::decode(d))); + } + Ok($thing(ret)) + } + } + }) + } + } + + impl, S> ::serialize::Encodable for $thing { + fn encode(&self, e: &mut E) -> ::std::prelude::Result<(), S> { + self.as_slice().encode(e) + } + } } ) diff --git a/src/secp256k1.rs b/src/secp256k1.rs index 53e8b48..83ac115 100644 --- a/src/secp256k1.rs +++ b/src/secp256k1.rs @@ -56,6 +56,9 @@ pub mod constants; pub mod ffi; pub mod key; +/// I dunno where else to put this.. +fn assert_type_is_copy() { } + /// A tag used for recovering the public key from a compact signature pub struct RecoveryId(i32);