#[macro_export]
macro_rules! impl_lang {
(
$(#[$($meta:meta)*])*
$vis:vis $lang:ident {
$($lang_item:tt)*
}
$(
$name:ident($ty:ty) {
$($ty_lang_item_item:tt)*
}
)*
) => {
$(#[$($meta)*])*
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
$vis struct $lang(());
impl $crate::lang::Lang for $lang {
$($lang_item)*
}
#[derive(Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
enum AnyKind {
$($name($ty),)*
}
#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
$vis struct Any {
kind: AnyKind,
}
impl core::fmt::Debug for Any {
#[inline]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.kind.fmt(f)
}
}
impl Any {
#[allow(unused)]
fn kind(&self) -> &AnyKind {
&self.kind
}
}
$(
impl From<$ty> for Any {
#[inline]
fn from(lang: $ty) -> Self {
Any { kind: AnyKind::$name(lang) }
}
}
)*
impl $crate::lang::LangItem<$lang> for Any {
#[inline]
fn format(
&self,
out: &mut $crate::fmt::Formatter<'_>,
config: &<$lang as $crate::lang::Lang>::Config,
format: &<$lang as $crate::lang::Lang>::Format,
) -> $crate::fmt::Result {
match &self.kind {
$(AnyKind::$name(lang) => lang.format(out, config, format),)*
}
}
}
$(
impl $crate::tokens::FormatInto<$lang> for $ty {
fn format_into(self, tokens: &mut $crate::Tokens<$lang>) {
tokens.append($crate::__priv::item::<$lang>(self.into()));
}
}
impl<'a> $crate::tokens::FormatInto<$lang> for &'a $ty {
fn format_into(self, tokens: &mut $crate::Tokens<$lang>) {
tokens.append($crate::__priv::item::<$lang>(self.clone().into()));
}
}
impl $crate::tokens::Register<$lang> for $ty {
fn register(self, tokens: &mut $crate::Tokens<$lang>) {
tokens.append($crate::__priv::register::<$lang>(self.into()));
}
}
impl<'a> $crate::tokens::Register<$lang> for &'a $ty {
fn register(self, tokens: &mut $crate::Tokens<$lang>) {
tokens.append($crate::__priv::register::<$lang>(self.clone().into()));
}
}
impl $crate::lang::LangItem<$lang> for $ty {
$($ty_lang_item_item)*
}
)*
}
}