//! An example of implementing the `BitFlags` trait manually for a flags type. //! //! This example doesn't use any macros. use std::{fmt, str}; use bitflags::{Flags, Flag}; // First: Define your flags type. It just needs to be `Sized + 'static`. pub struct ManualFlags(u32); // Not required: Define some constants for valid flags impl ManualFlags { pub const A: ManualFlags = ManualFlags(0b00000001); pub const B: ManualFlags = ManualFlags(0b00000010); pub const C: ManualFlags = ManualFlags(0b00000100); pub const ABC: ManualFlags = ManualFlags(0b00000111); } // Next: Implement the `BitFlags` trait, specifying your set of valid flags // and iterators impl Flags for ManualFlags { const FLAGS: &'static [Flag] = &[ Flag::new("A", Self::A), Flag::new("B", Self::B), Flag::new("C", Self::C), ]; type Bits = u32; fn bits(&self) -> u32 { self.0 } fn from_bits_retain(bits: u32) -> Self { Self(bits) } } // Not required: Add parsing support impl str::FromStr for ManualFlags { type Err = bitflags::parser::ParseError; fn from_str(input: &str) -> Result { bitflags::parser::from_str(input) } } // Not required: Add formatting support impl fmt::Display for ManualFlags { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { bitflags::parser::to_writer(self, f) } } fn main() { println!("{}", ManualFlags::A.union(ManualFlags::B).union(ManualFlags::C)); }