#[macro_export]
macro_rules! variants {
(
$name:ident,
base: $base:literal,
variant: { $( $variant_key:ident : $variant_class:literal ),+ $(,)? },
size: { $( $size_key:ident : $size_class:literal ),+ $(,)? },
defaults: { variant: $default_variant:ident, size: $default_size:ident } $(,)?
) => {
$crate::variants!(@paste
$name,
$base,
[ $( $variant_key : $variant_class ),+ ],
[ $( $size_key : $size_class ),+ ],
$default_variant,
$default_size
);
};
(@paste
$name:ident,
$base:literal,
[ $( $variant_key:ident : $variant_class:literal ),+ ],
[ $( $size_key:ident : $size_class:literal ),+ ],
$default_variant:ident,
$default_size:ident
) => {
$crate::__paste! {
#[allow(dead_code)]
pub enum [< $name Variant >] {
$( [< $variant_key:camel >] ),+
}
#[allow(dead_code)]
pub enum [< $name Size >] {
$( [< $size_key:camel >] ),+
}
#[allow(dead_code)]
pub struct [< $name Variants >] {
pub variant: [< $name Variant >],
pub size: [< $name Size >],
}
impl Default for [< $name Variants >] {
fn default() -> Self {
Self {
variant: [< $name Variant >]::[< $default_variant:camel >],
size: [< $name Size >]::[< $default_size:camel >],
}
}
}
#[allow(dead_code)]
pub struct $name;
impl $name {
pub fn class(v: [< $name Variants >]) -> String {
let variant_class = match v.variant {
$( [< $name Variant >]::[< $variant_key:camel >] => $variant_class, )+
};
let size_class = match v.size {
$( [< $name Size >]::[< $size_key:camel >] => $size_class, )+
};
$crate::cn(&[$base, variant_class, size_class])
}
}
}
};
}
#[doc(hidden)]
pub use paste::paste as __paste;