use super::*;
#[derive(Copy, Clone, Debug)]
pub enum ParseAdvance {
Offset(usize),
Character(char),
String(&'static str),
}
impl From<usize> for ParseAdvance {
fn from(v: usize) -> Self {
ParseAdvance::Offset(v)
}
}
impl From<char> for ParseAdvance {
fn from(c: char) -> Self {
ParseAdvance::Character(c)
}
}
impl From<&'static str> for ParseAdvance {
fn from(s: &'static str) -> Self {
ParseAdvance::String(s)
}
}
impl<'i> ParseState<'i> {
#[inline]
pub fn advance<T>(self, term: T) -> ParseState<'i>
where
T: Into<ParseAdvance>,
{
let offset = term.into().as_offset();
debug_assert!(offset <= self.residual.len(), "offset is out of range");
let residual = unsafe { self.residual.get_unchecked(offset..) };
ParseState { residual, start_offset: self.start_offset + offset, stop_reason: self.stop_reason }
}
#[inline]
pub fn advance_view(self, offset: usize) -> ParseResult<'i, &'i str> {
debug_assert!(offset <= self.residual.len(), "offset is out of range");
let view = unsafe { self.residual.get_unchecked(..offset) };
let residual = unsafe { self.residual.get_unchecked(offset..) };
ParseState { residual, start_offset: self.start_offset + offset, stop_reason: self.stop_reason }.finish(view)
}
}
impl ParseAdvance {
#[inline]
pub const fn as_offset(&self) -> usize {
match self {
ParseAdvance::Offset(v) => *v,
ParseAdvance::Character(v) => v.len_utf8(),
ParseAdvance::String(v) => v.len(),
}
}
}