netlink_rust/core/
helpers.rs

1/// Creates an enum with various traits.
2/// The first key-value pair is the default used if any conversion would fail.
3#[macro_export]
4macro_rules! extended_enum_default {
5    ( $(#[$outer:meta])* $name:ident, $ty:ty, $(#[$inner_def:meta])* $var_def:ident => $val_def:expr,
6    $( $(#[$inner:meta])* $var:ident => $val:expr ),+ $(,)* ) => (
7
8        $(#[$outer])*
9        #[derive(Clone,Debug,Eq,PartialEq)]
10        pub enum $name {
11            $(#[$inner_def])*
12            $var_def,
13            $(
14                $(#[$inner])*
15                $var,
16            )*
17        }
18
19        impl From<$ty> for $name {
20            fn from(v: $ty) -> Self {
21                match v {
22                    $val_def => $name::$var_def,
23                    $( $val => $name::$var,)*
24                    _ => $name::$var_def,
25                }
26            }
27        }
28
29        impl From<$name> for $ty {
30            fn from(v: $name) -> Self {
31                match v {
32                    $name::$var_def => $val_def,
33                    $( $name::$var => $val, )*
34                }
35            }
36        }
37
38        impl ConvertFrom<$ty> for $name {
39            fn convert_from(v: $ty) -> Option<Self> {
40                match v {
41                    $val_def => Some($name::$var_def),
42                    $( $val => Some($name::$var),)*
43                    _ => None,
44                }
45            }
46        }
47
48        impl PartialEq<$name> for $ty {
49            fn eq(&self, other: &$name) -> bool {
50                match *other {
51                    $name::$var_def => *self == $val_def,
52                    $( $name::$var => *self == $val, )*
53                }
54            }
55
56            fn ne(&self, other: &$name) -> bool {
57                match *other {
58                    $name::$var_def => *self != $val_def,
59                    $( $name::$var => *self != $val, )*
60                }
61            }
62        }
63    );
64}
65
66/// Creates an enum with various traits.
67/// The first key-value pair is the default used if any conversion would fail.
68#[macro_export]
69macro_rules! extended_enum {
70    ( $(#[$outer:meta])* $name:ident, $ty:ty, $( $(#[$inner:meta])* $var:ident => $val:expr ),+ $(,)* ) => (
71
72        $(#[$outer])*
73        #[derive(Clone,Debug,Eq,PartialEq)]
74        pub enum $name {
75            $(
76                $(#[$inner])*
77                $var,
78            )*
79        }
80
81        impl From<$ty> for $name {
82            fn from(v: $ty) -> Self {
83                match v {
84                    $( $val => $name::$var,)*
85                    _ => panic!("Bad Value"),
86                }
87            }
88        }
89
90        impl From<$name> for $ty {
91            fn from(v: $name) -> Self {
92                match v {
93                    $( $name::$var => $val, )*
94                }
95            }
96        }
97
98        impl ConvertFrom<$ty> for $name {
99            fn convert_from(v: $ty) -> Option<Self> {
100                match v {
101                    $( $val => Some($name::$var),)*
102                    _ => None,
103                }
104            }
105        }
106
107        impl PartialEq<$name> for $ty {
108            fn eq(&self, other: &$name) -> bool {
109                match *other {
110                    $( $name::$var => *self == $val, )*
111                }
112            }
113
114            fn ne(&self, other: &$name) -> bool {
115                match *other {
116                    $( $name::$var => *self != $val, )*
117                }
118            }
119        }
120    );
121}