1 /// A macro which defines an enum type.
2 macro_rules! enum_builder {
3     (
4     $(#[$comment:meta])*
5     @U8
6         EnumName: $enum_name: ident;
7         EnumVal { $( $enum_var: ident => $enum_val: expr ),* }
8     ) => {
9         $(#[$comment])*
10         #[derive(Debug, PartialEq, Eq, Clone, Copy)]
11         pub enum $enum_name {
12             $( $enum_var),*
13             ,Unknown(u8)
14         }
15         impl $enum_name {
16             pub fn get_u8(&self) -> u8 {
17                 let x = self.clone();
18                 match x {
19                     $( $enum_name::$enum_var => $enum_val),*
20                     ,$enum_name::Unknown(x) => x
21                 }
22             }
23         }
24         impl Codec for $enum_name {
25             fn encode(&self, bytes: &mut Vec<u8>) {
26                 self.get_u8().encode(bytes);
27             }
28 
29             fn read(r: &mut Reader) -> Option<Self> {
30                 Some(match u8::read(r) {
31                     None => return None,
32                     $( Some($enum_val) => $enum_name::$enum_var),*
33                     ,Some(x) => $enum_name::Unknown(x)
34                 })
35             }
36         }
37     };
38     (
39     $(#[$comment:meta])*
40     @U16
41         EnumName: $enum_name: ident;
42         EnumVal { $( $enum_var: ident => $enum_val: expr ),* }
43     ) => {
44         $(#[$comment])*
45         #[derive(Debug, PartialEq, Eq, Clone, Copy)]
46         pub enum $enum_name {
47             $( $enum_var),*
48             ,Unknown(u16)
49         }
50         impl $enum_name {
51             pub fn get_u16(&self) -> u16 {
52                 let x = self.clone();
53                 match x {
54                     $( $enum_name::$enum_var => $enum_val),*
55                     ,$enum_name::Unknown(x) => x
56                 }
57             }
58         }
59         impl Codec for $enum_name {
60             fn encode(&self, bytes: &mut Vec<u8>) {
61                 self.get_u16().encode(bytes);
62             }
63 
64             fn read(r: &mut Reader) -> Option<Self> {
65                 Some(match u16::read(r) {
66                     None => return None,
67                     $( Some($enum_val) => $enum_name::$enum_var),*
68                     ,Some(x) => $enum_name::Unknown(x)
69                 })
70             }
71         }
72     };
73 }
74