use crate::Buffer;
use crate::Lexer;
use crate::Token;
use std::fmt::Display;
use std::marker::PhantomData;
use std::ops::Deref;
use std::ops::DerefMut;
#[derive(Lexer, Token, Debug, Clone)]
#[lexerus = "crate"]
pub struct Space<'code>(#[pattern = " "] Buffer<'code>);
#[derive(Lexer, Token, Debug, Clone)]
#[lexerus = "crate"]
pub struct Tab<'code>(#[pattern = "\t"] Buffer<'code>);
#[derive(Lexer, Token, Debug, Clone)]
#[lexerus = "crate"]
pub struct NewLine<'code>(
#[pattern("\n", "\r")] Buffer<'code>,
);
#[derive(Lexer, Token, Debug, Clone)]
#[lexerus = "crate"]
pub enum WhiteSpace<'code> {
Space(Space<'code>),
Tab(Tab<'code>),
NewLine(NewLine<'code>),
}
pub type WhiteSpaces<'code> =
PhantomData<super::Group<'code, WhiteSpace<'code>, 1>>;
#[derive(Clone, Debug)]
pub struct Isolate<Type> {
pub token: Type,
}
impl<Type: std::fmt::Display> Display for Isolate<Type> {
fn fmt(
&self,
f: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
Display::fmt(&self.token, f)
}
}
impl<Type> AsMut<Type> for Isolate<Type> {
fn as_mut(&mut self) -> &mut Type {
&mut self.token
}
}
impl<Type> AsRef<Type> for Isolate<Type> {
fn as_ref(&self) -> &Type {
&self.token
}
}
impl<Type> DerefMut for Isolate<Type> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.token
}
}
impl<Type> Deref for Isolate<Type> {
type Target = Type;
fn deref(&self) -> &Self::Target {
&self.token
}
}
impl<'code, Type: Token<'code>> Token<'code>
for Isolate<Type>
{
const NAME: &'static str = Type::NAME;
fn buffer(&self) -> Option<Buffer<'code>> {
self.token.buffer()
}
}
impl<'code, Type: Lexer<'code>> Lexer<'code>
for Isolate<Type>
{
fn lex(
buffer: &mut crate::Buffer<'code>,
) -> Result<Self, crate::Error<'code>> {
let mut local_buffer = buffer.clone();
let count: ::std::primitive::usize = 0;
let _ = <PhantomData<
Option<WhiteSpaces<'code>>,
> as crate::Lexer>::lex(
&mut local_buffer
);
let token =
<Type as crate::Lexer>::lex(&mut local_buffer)
.map_err(
|mut err: crate::Error<'code>| {
err.matched += count;
err
},
)?;
let _ = <PhantomData<
Option<WhiteSpaces<'code>>,
> as crate::Lexer>::lex(
&mut local_buffer
);
*buffer = local_buffer;
let ok_value = Self { token };
Ok::<Self, crate::Error<'code>>(ok_value)
}
}