#[macro_export]
macro_rules! impl_flag_trait {
($name:ident, $type:ty) => {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct $name {
/// Internal bit-field storage.
value: $type,
}
$crate::impl_new_flag!($name, $type);
$crate::impl_default!($name, $type);
$crate::impl_from_flag!($name, $type);
$crate::impl_flag_value!($name, $type);
impl $crate::flag::Flag for $name {
type Value = $type;
fn set_flag(&mut self, flag: Self::Value) { self.value |= flag; }
fn check_flag(&self, flag: Self::Value) -> bool { self.value & flag != 0 }
fn clear_flag(&mut self, flag: Self::Value) { self.value &= !flag; }
fn toggle_flag(&mut self, flag: Self::Value) { self.value ^= flag; }
fn get_flags(&self) -> Self::Value { self.value }
fn set_flags(&mut self, value: Self::Value) { self.value = value; }
}
};
}
#[macro_export]
macro_rules! impl_new_flag {
($name:ident, $type:ty) => {
impl $name {
pub fn new(v: $type) -> Self {
$name { value: v }
}
}
};
}
#[macro_export]
macro_rules! impl_default {
($name:ident, $type:ty) => {
impl Default for $name {
fn default() -> Self {
Self { value: 0 as $type }
}
}
}
}
#[macro_export]
macro_rules! impl_flag_value {
($name:ident, $type:ty) => {
impl $name {
pub fn value(&self) -> $type {
self.value
}
}
}
}
#[macro_export]
macro_rules! impl_from_flag {
($name:ident, $type:ty) => {
impl From<$type> for $name {
fn from(value: $type) -> Self {
Self { value }
}
}
};
}
#[macro_export]
macro_rules! impl_descriptor {
($name:ident, $ty:ty, derives = [$($derive:path),* $(,)?]) => {
#[derive(Debug, Clone $(, $derive)* )]
pub struct $name<T> {
pub name: $ty,
pub flag_type: $crate::flag_type::FlagType,
pub value: T,
pub description: Option<String>,
pub created_at: Option<String>,
}
impl<T> $name<T> {
pub fn new(
name: $ty,
flag_type: $crate::flag_type::FlagType,
value: T,
description: Option<String>,
created_at: Option<String>,
) -> Self {
Self {
name,
flag_type,
value,
description,
created_at,
}
}
pub fn with_defaults(
name: $ty,
flag_type: $crate::flag_type::FlagType,
value: T
) -> Self {
Self {
name,
flag_type,
value,
description: None,
created_at: None,
}
}
}
}
}