use super::{Flag, Svg, SvgScaleMode};
use crate::Colour;
#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::*;
const BLACK: Colour = Colour::hex(0x000000);
const WHITE: Colour = Colour::hex(0xFFFFFF);
macro_rules! gen_flags {
(
$(
$(#[doc = $doc:literal])*
$flag:ident
),*$(,)?
) => {
#[cfg_attr(target_arch = "wasm32", derive(Serialize, Deserialize))]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
#[repr(u8)]
pub enum PresetFlag {
$(
#[cfg_attr(
not(target_arch = "wasm32"),
doc = concat!($($doc, "\n",)*)
)]
$flag,
)*
}
#[cfg(target_arch = "wasm32")]
impl PresetFlag {
pub(crate) const fn max_discriminant() -> u8 {
let mut max = 0;
$(
if PresetFlag::$flag as u8 > max {
max = PresetFlag::$flag as u8;
}
)*
max
}
}
impl std::str::FromStr for PresetFlag {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
$(
stringify!($flag) => Ok(PresetFlag::$flag),
)*
_ => Err(()),
}
}
}
pastey::paste! {
impl PresetFlag {
pub const fn all() -> &'static [Flag<'static>] {
&[
$(
[<$flag:upper>],
)*
]
}
}
impl std::ops::Deref for PresetFlag {
type Target = Flag<'static>;
fn deref(&self) -> &Self::Target {
match self {
$(
PresetFlag::$flag => &[<$flag:upper>],
)*
}
}
}
}
};
}
gen_flags! {
Agender,
Aromantic,
Asexual,
Bisexual,
Genderfluid,
Genderqueer,
Intersex,
Lesbian,
Nonbinary,
Pansexual,
Polyamory,
Rainbow,
Transgender,
}
pub(crate) const AGENDER: Flag = Flag::builder(
"Agender",
&[
BLACK,
Colour::hex(0xB9B9B9), WHITE,
Colour::hex(0xB8F483), WHITE,
Colour::hex(0xB9B9B9), BLACK,
],
)
.build();
pub(crate) const AROMANTIC: Flag = Flag::builder(
"Aromantic",
&[
Colour::hex(0x3DA542), Colour::hex(0xA7D379), WHITE,
Colour::hex(0xA9A9A9), BLACK,
],
)
.build();
pub(crate) const ASEXUAL: Flag = Flag::builder(
"Asexual",
&[
BLACK,
Colour::hex(0xA3A3A3), WHITE,
Colour::hex(0x800080), ],
)
.build();
pub(crate) const BISEXUAL: Flag = Flag::builder(
"Bisexual",
&[
Colour::hex(0xD60270), Colour::hex(0xD60270), Colour::hex(0x9B4F96), Colour::hex(0x0038A8), Colour::hex(0x0038A8), ],
)
.build();
pub(crate) const GENDERFLUID: Flag = Flag::builder(
"Genderfluid",
&[
Colour::hex(0xFF75A2), WHITE,
Colour::hex(0xBE18D6), Colour::hex(0x2C2C2C), Colour::hex(0x333EBD), ],
)
.build();
pub(crate) const GENDERQUEER: Flag = Flag::builder(
"Genderqueer",
&[
Colour::hex(0xB67FDD), WHITE,
Colour::hex(0x49821E), ],
)
.build();
pub(crate) const INTERSEX: Flag = Flag::builder(
"Intersex",
&[
Colour::hex(0xFFD800), Colour::hex(0x7902AA), ],
)
.svg(
Svg::builder(include_bytes!("svg/intersex.svg"))
.scale(SvgScaleMode::Cover)
.build(),
)
.build();
pub(crate) const LESBIAN: Flag = Flag::builder(
"Lesbian",
&[
Colour::hex(0xD52D00), Colour::hex(0xFF9A56), WHITE,
Colour::hex(0xD362A4), Colour::hex(0xA30262), ],
)
.build();
pub(crate) const NONBINARY: Flag = Flag::builder(
"Nonbinary",
&[
Colour::hex(0xFFF433), WHITE,
Colour::hex(0x9B59D0), Colour::hex(0x2D2D2D), ],
)
.build();
pub(crate) const PANSEXUAL: Flag = Flag::builder(
"Pansexual",
&[
Colour::hex(0xFF218C), Colour::hex(0xFFD800), Colour::hex(0x21B1FF), ],
)
.build();
pub(crate) const POLYAMORY: Flag = Flag::builder(
"Polyamory",
&[
Colour::hex(0x009FE3), Colour::hex(0xE50051), Colour::hex(0x340C46), ],
)
.svg(
Svg::builder(include_bytes!("svg/polyamory.svg"))
.scale(SvgScaleMode::Cover)
.build(),
)
.build();
pub(crate) const RAINBOW: Flag = Flag::builder(
"Rainbow",
&[
Colour::hex(0xE50000), Colour::hex(0xFF8D00), Colour::hex(0xFFEE00), Colour::hex(0x028121), Colour::hex(0x004CFF), Colour::hex(0x770088), ],
)
.build();
pub(crate) const TRANSGENDER: Flag = Flag::builder(
"Transgender",
&[
Colour::hex(0x5BCEFA), Colour::hex(0xF5A9B8), WHITE,
Colour::hex(0xF5A9B8), Colour::hex(0x5BCEFA), ],
)
.build();