#[cfg(any(feature = "model", feature = "utils"))]
macro_rules! cdn {
($e:expr) => {
concat!("https://cdn.discordapp.com", $e)
};
($e:expr, $($rest:tt)*) => {
format!(cdn!($e), $($rest)*)
};
}
#[cfg(feature = "http")]
macro_rules! api {
($e:expr) => {
concat!("https://discord.com/api/v10", $e)
};
($e:expr, $($rest:tt)*) => {
format!(api!($e), $($rest)*)
};
}
#[cfg(feature = "http")]
macro_rules! status {
($e:expr) => {
concat!("https://status.discord.com/api/v2", $e)
};
}
macro_rules! enum_number {
(
$(#[$outer:meta])*
$vis:vis enum $Enum:ident {
$(
$(#[doc = $doc:literal])*
$(#[cfg $($cfg:tt)*])?
$(#[default $($dummy:tt)?])?
$Variant:ident = $value:literal,
)*
_ => Unknown($T:ty),
}
) => {
$(#[$outer])*
$vis enum $Enum {
$(
$(#[doc = $doc])*
$(#[cfg $($cfg)*])?
$(#[default $($dummy:tt)?])?
$Variant,
)*
Unknown($T),
}
impl From<$T> for $Enum {
fn from(value: $T) -> Self {
match value {
$($(#[cfg $($cfg)*])? $value => Self::$Variant,)*
unknown => Self::Unknown(unknown),
}
}
}
impl From<$Enum> for $T {
fn from(value: $Enum) -> Self {
match value {
$($(#[cfg $($cfg)*])? $Enum::$Variant => $value,)*
$Enum::Unknown(unknown) => unknown,
}
}
}
};
}
macro_rules! bitflags {
(
$(#[$outer:meta])*
$vis:vis struct $BitFlags:ident: $T:ty {
$(
$(#[$inner:ident $($args:tt)*])*
const $Flag:ident = $value:expr;
)*
}
) => {
$(#[$outer])*
#[repr(Rust, packed)]
$vis struct $BitFlags($T);
bitflags::bitflags! {
impl $BitFlags: $T {
$(
$(#[$inner $($args)*])*
const $Flag = $value;
)*
}
}
bitflags!(__impl_serde $BitFlags: $T);
};
(__impl_serde $BitFlags:ident: $T:tt) => {
impl<'de> serde::de::Deserialize<'de> for $BitFlags {
fn deserialize<D: serde::de::Deserializer<'de>>(deserializer: D) -> std::result::Result<Self, D::Error> {
Ok(Self::from_bits_truncate(<$T>::deserialize(deserializer)?))
}
}
impl serde::ser::Serialize for $BitFlags {
fn serialize<S: serde::ser::Serializer>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> {
self.bits().serialize(serializer)
}
}
};
}
#[cfg(test)]
mod tests {
use crate::json::{assert_json, json};
#[test]
fn enum_number() {
enum_number! {
#[derive(Copy, Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[serde(from = "u8", into = "u8")]
pub enum T {
A = 1,
B = 2,
C = 3,
_ => Unknown(u8),
}
}
assert_json(&T::A, json!(1));
assert_json(&T::B, json!(2));
assert_json(&T::C, json!(3));
assert_json(&T::Unknown(123), json!(123));
}
}