use super::{Cons, Element, ErasedElement, Lang, Tokens};
pub trait FormatTokens<'el, L>
where
L: Lang,
{
fn format_tokens(self, tokens: &mut Tokens<'el, L>);
fn is_empty(&self) -> bool {
false
}
}
impl<'el, L> FormatTokens<'el, L> for Tokens<'el, L>
where
L: Lang,
{
fn format_tokens(self, tokens: &mut Self) {
tokens.elements.extend(self.elements);
}
fn is_empty(&self) -> bool {
self.elements.is_empty()
}
}
impl<'el, L> FormatTokens<'el, L> for Vec<Tokens<'el, L>>
where
L: Lang,
{
fn format_tokens(self, tokens: &mut Tokens<'el, L>) {
for t in self {
tokens.elements.extend(t.elements);
}
}
fn is_empty(&self) -> bool {
self.iter().all(|t| t.is_empty())
}
}
impl<'el, L> FormatTokens<'el, L> for Element<'el, L>
where
L: Lang,
{
fn format_tokens(self, tokens: &mut Tokens<'el, L>) {
tokens.elements.push(self);
}
}
impl<'el, L> FormatTokens<'el, L> for ErasedElement<'el>
where
L: Lang,
{
fn format_tokens(self, tokens: &mut Tokens<'el, L>) {
tokens.elements.push(self.into());
}
}
impl<'el, L> FormatTokens<'el, L> for &'el str
where
L: Lang,
{
fn format_tokens(self, tokens: &mut Tokens<'el, L>) {
tokens.elements.push(self.into());
}
}
impl<'el, L> FormatTokens<'el, L> for &'el String
where
L: Lang,
{
fn format_tokens(self, tokens: &mut Tokens<'el, L>) {
tokens.elements.push(self.as_str().into());
}
}
impl<'el, L> FormatTokens<'el, L> for String
where
L: Lang,
{
fn format_tokens(self, tokens: &mut Tokens<'el, L>) {
tokens.elements.push(self.into());
}
}
impl<'el, L> FormatTokens<'el, L> for Cons<'el>
where
L: Lang,
{
fn format_tokens(self, tokens: &mut Tokens<'el, L>) {
tokens.elements.push(self.into());
}
}
impl<'el, L, T> FormatTokens<'el, L> for Option<T>
where
L: Lang,
T: FormatTokens<'el, L>,
{
fn format_tokens(self, tokens: &mut Tokens<'el, L>) {
if let Some(inner) = self {
inner.format_tokens(tokens);
}
}
}