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) } } } }