macro_rules! dacite_bitflags {
(
$( #[$attr:meta] )*
pub struct $flags:ident: $vks:ty;
pub enum $flag_bits:ident: $vks_flag_bits:ty;
max_enum: $max_enum:expr;
flags {
$(
$( #[$flag_attr:meta] )*
const $flag:ident [$flag_bit:ident] = $value:expr;
)*
}
no_bits {
$(
$( #[$flag_no_bits_attr:meta] )*
const $flag_no_bits:ident = $value_no_bits:expr;
)*
}
) => (
bitflags! {
$( #[$attr] )*
#[derive(Default)]
pub struct $flags: $vks {
const MAX_ENUM = $max_enum;
$(
$( #[$flag_attr] )*
const $flag = $value;
)*
$(
$( #[$flag_no_bits_attr] )*
const $flag_no_bits = $value_no_bits;
)*
}
}
impl From<$flag_bits> for $flags {
fn from(bits: $flag_bits) -> Self {
match bits {
$( $flag_bits::$flag_bit => $flags::$flag, )*
$flag_bits::Unknown(bit) => $flags::from_bits_truncate(bit),
}
}
}
$( #[$attr] )*
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum $flag_bits {
$( $flag_bit, )*
Unknown($vks_flag_bits),
}
impl $flag_bits {
pub fn from_flags(flags: $flags) -> Option<Self> {
match flags {
$(
$flags::$flag => Some($flag_bits::$flag_bit),
)*
_ => {
if flags.bits().count_ones() == 1 {
Some($flag_bits::Unknown(flags.bits()))
}
else {
None
}
}
}
}
#[inline]
pub fn from_bits(bits: $vks_flag_bits) -> Option<Self> {
Self::from_flags($flags::from_bits_truncate(bits))
}
#[inline]
pub fn bit(&self) -> $vks_flag_bits {
$flags::from(*self).bits()
}
}
)
}