1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
#[allow(unused_macros)]
#[macro_export]
macro_rules! impl_byte_array_newtype {
($thing:ident, $ty:ty, $len:expr) => {
impl $thing {
/// Instantiates from a hex string
#[allow(dead_code)]
pub fn from_hex(hex_str: &str) -> Result<$thing, clarity::util::HexError> {
use clarity::util::hash::hex_bytes;
let _hex_len = $len * 2;
match (hex_str.len(), hex_bytes(hex_str)) {
(_hex_len, Ok(bytes)) => {
if bytes.len() != $len {
return Err(clarity::util::HexError::BadLength(hex_str.len()));
}
let mut ret = [0; $len];
ret.copy_from_slice(&bytes);
Ok($thing(ret))
}
(_, Err(e)) => Err(e),
}
}
/// Instantiates from a slice of bytes
#[allow(dead_code)]
pub fn from_bytes(inp: &[u8]) -> Option<$thing> {
match inp.len() {
$len => {
let mut ret = [0; $len];
ret.copy_from_slice(inp);
Some($thing(ret))
}
_ => None,
}
}
/// Instantiates from a slice of bytes, converting to host byte order
#[allow(dead_code)]
pub fn from_bytes_be(inp: &[u8]) -> Option<$thing> {
$thing::from_vec_be(&inp.to_vec())
}
/// Instantiates from a vector of bytes
#[allow(dead_code)]
pub fn from_vec(inp: &Vec<u8>) -> Option<$thing> {
match inp.len() {
$len => {
let mut ret = [0; $len];
let bytes = &inp[..inp.len()];
ret.copy_from_slice(&bytes);
Some($thing(ret))
}
_ => None,
}
}
/// Instantiates from a big-endian vector of bytes, converting to host byte order
#[allow(dead_code)]
pub fn from_vec_be(b: &Vec<u8>) -> Option<$thing> {
match b.len() {
$len => {
let mut ret = [0; $len];
let bytes = &b[0..b.len()];
// flip endian to le if we are le
for i in 0..$len {
ret[$len - 1 - i] = bytes[i];
}
Some($thing(ret))
}
_ => None,
}
}
/// Convert to a hex string
#[allow(dead_code)]
pub fn to_hex(&self) -> String {
use clarity::util::hash::to_hex;
to_hex(&self.0)
}
}
impl std::fmt::Display for $thing {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.to_hex())
}
}
impl std::convert::AsRef<[u8]> for $thing {
fn as_ref(&self) -> &[u8] {
&self.0
}
}
impl std::convert::From<[u8; $len]> for $thing {
fn from(o: [u8; $len]) -> Self {
Self(o)
}
}
};
}