nimiq_macros/
lib.rs

1#[macro_export]
2macro_rules! create_typed_array {
3    ($name: ident, $t: ty, $len: expr) => {
4        #[repr(C)]
5        #[derive(Default, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
6        pub struct $name ([$t; $len]);
7
8        impl<'a> From<&'a [$t]> for $name {
9            fn from(slice: &'a [$t]) -> Self {
10                assert_eq!(slice.len(), $len, "Tried to create instance with slice of wrong length");
11                let mut a = [0 as $t; $len];
12                a.clone_from_slice(&slice[0..$len]);
13                $name(a)
14            }
15        }
16
17        impl ::beserial::Deserialize for $name {
18            fn deserialize<R: ::beserial::ReadBytesExt>(reader: &mut R) -> Result<Self, ::beserial::SerializingError> {
19                let mut a = [0 as $t; $len];
20                reader.read_exact(&mut a[..])?;
21                Ok($name(a))
22            }
23        }
24
25        impl ::beserial::Serialize for $name {
26            fn serialize<W: ::beserial::WriteBytesExt>(&self, writer: &mut W) -> Result<usize, ::beserial::SerializingError> {
27                writer.write_all(&self.0)?;
28                Ok($len)
29            }
30
31            fn serialized_size(&self) -> usize {
32                $len
33            }
34        }
35
36        impl From<[$t; $len]> for $name {
37            fn from(arr: [$t; $len]) -> Self {
38                $name(arr)
39            }
40        }
41
42        impl From<$name> for [$t; $len] {
43            fn from(i: $name) -> [$t; $len] {
44                i.0
45            }
46        }
47
48        impl ::std::fmt::Debug for $name {
49            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
50                f.write_str(&::hex::encode(&self.0))
51            }
52        }
53
54        impl $name {
55            pub const SIZE: usize = $len;
56            #[inline]
57            pub fn len() -> usize { $len }
58            pub fn as_bytes(&self) -> &[$t] { &self.0 }
59        }
60    };
61}
62
63#[macro_export]
64macro_rules! add_hex_io_fns_typed_arr {
65    ($name: ident, $len: expr) => {
66        impl ::std::fmt::Display for $name {
67            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
68                f.write_str(&::hex::encode(&self.0))
69            }
70        }
71
72        impl $name {
73            pub fn to_hex(&self) -> String { ::hex::encode(&self.0) }
74        }
75
76        impl ::std::str::FromStr for $name {
77            type Err = ::hex::FromHexError;
78
79            fn from_str(s: &str) -> Result<Self, Self::Err> {
80                let vec = Vec::from_hex(s)?;
81                if vec.len() == $len {
82                    Ok($name::from(&vec[..]))
83                } else {
84                    Err(::hex::FromHexError::InvalidStringLength)
85                }
86            }
87        }
88
89        impl From<&'static str> for $name {
90            fn from(s: &'static str) -> Self {
91                s.parse().unwrap()
92            }
93        }
94    };
95}
96
97#[macro_export]
98macro_rules! upgrade_weak {
99    ($weak_ref: expr) => {
100        if let Some(arc) = $weak_ref.upgrade() {
101            arc
102        } else {
103            return;
104        }
105    }
106}