#[derive(Debug)]
pub enum LiteralKind<'a> {
String(Context<'a>),
Number(Context<'a>),
True(Context<'a>),
False(Context<'a>),
Null(Context<'a>),
}
#[derive(Debug)]
pub enum IdentifierKind<'a> {
String(Context<'a>),
}
#[derive(Debug)]
pub enum DelimiterKind<'a> {
ObjectPrec(Context<'a>),
ObjectTerm(Context<'a>),
ArrayPrec(Context<'a>),
ArrayTerm(Context<'a>),
}
#[derive(Debug)]
pub enum TokenKind<'a> {
Identifier(IdentifierKind<'a>),
Literal(LiteralKind<'a>),
Delimiter(DelimiterKind<'a>),
}
#[derive(Debug)]
pub struct Position {
l: usize,
c: usize,
i: usize,
}
impl<'a> Position {
#[inline]
pub fn new(l: usize, c: usize, i: usize) -> Position {
Position { l, c, i }
}
#[inline]
pub fn line(&'a self) -> usize {
self.l
}
#[inline]
pub fn column(&'a self) -> usize {
self.c
}
#[inline]
pub fn index(&'a self) -> usize {
self.i
}
}
#[derive(Debug)]
pub struct Location {
s: Position,
e: Position,
}
impl<'a> Location {
#[inline]
pub fn new(s: Position, e: Position) -> Location {
Location { s, e }
}
#[inline]
pub fn start(&'a self) -> &'a Position {
&self.s
}
#[inline]
pub fn end(&'a self) -> &'a Position {
&self.e
}
}
#[derive(Debug)]
pub struct Context<'a> {
l: Location,
b: &'a [u8],
}
impl<'a> Context<'a> {
#[inline]
pub fn new(l: Location, b: &'a [u8]) -> Context<'a> {
Context { l, b }
}
#[inline]
pub fn bytes(&'a self) -> &'a [u8] {
self.b
}
#[inline]
pub fn location(&'a self) -> &'a Location {
&self.l
}
}