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
macro_rules! pub_bitflags_display {
($flags:ident, $ty:ty, $($name:ident = $value:literal),+) => {
bitflags! {
#[derive(Default)]
pub struct $flags: $ty {
$(const $name = $value;)*
}
}
impl ::std::fmt::Display for $flags {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
let mut start = true;
$(
if self.contains($flags::$name) {
if start {
#[allow(unused_assignments)]
start = false;
} else {
write!(f, " ")?;
}
write!(f, stringify!($name))?;
}
)*
Ok(())
}
}
impl ::std::str::FromStr for $flags {
type Err = ();
fn from_str(s: &str) -> Result<$flags, Self::Err> {
let mut flags = $flags::empty();
for f in s.split(char::is_whitespace) {
match f {
"" => { },
$(
stringify!($name) => flags |= $flags::$name,
)*
_ => return Err(())
}
}
Ok(flags)
}
}
}
}