use crate::{
lexer::Span,
utils::{SimpleSpan, human_display::DisplayHuman},
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct IncompleteToken<Knowledge, S = SimpleSpan> {
span: S,
knowledge: Option<Knowledge>,
}
impl<Knowledge> core::fmt::Display for IncompleteToken<Knowledge>
where
Knowledge: DisplayHuman,
{
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match &self.knowledge {
Some(knowledge) => write!(
f,
"incomplete {} token at {}",
knowledge.display(),
self.span
),
None => write!(f, "incomplete token at {}", self.span),
}
}
}
impl<Knowledge> core::error::Error for IncompleteToken<Knowledge> where
Knowledge: DisplayHuman + core::fmt::Debug
{
}
impl<Knowledge, S> IncompleteToken<Knowledge, S> {
#[cfg_attr(not(tarpaulin), inline(always))]
const fn new_in(span: S, knowledge: Option<Knowledge>) -> Self {
Self { span, knowledge }
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(span: S) -> Self {
Self::new_in(span, None)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_knowledge(span: S, knowledge: Knowledge) -> Self {
Self::new_in(span, Some(knowledge))
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn span(&self) -> S
where
S: Copy,
{
self.span
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn knowledge(&self) -> Option<&Knowledge> {
self.knowledge.as_ref()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn into_components(self) -> (S, Option<Knowledge>) {
(self.span, self.knowledge)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bump(&mut self, offset: &S::Offset)
where
S: Span,
{
self.span.bump(offset);
}
}