use core::{marker::PhantomData, ops::AddAssign};
use crate::{Lexer, utils::Message};
pub type MissingSyntaxOf<'inp, Syntax, L, Lang = ()> =
MissingSyntax<Syntax, <L as Lexer<'inp>>::Offset, Lang>;
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct MissingSyntax<Syntax, O = usize, Lang: ?Sized = ()> {
offset: O,
msg: Option<Message>,
_syntax: PhantomData<Syntax>,
_lang: PhantomData<Lang>,
}
impl<Syntax, O> MissingSyntax<Syntax, O> {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(offset: O) -> Self {
Self::of(offset)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_message(offset: O, message: Message) -> Self {
Self::with_message_of(offset, message)
}
}
impl<Syntax, O, Lang: ?Sized> MissingSyntax<Syntax, O, Lang> {
#[cfg_attr(not(tarpaulin), inline(always))]
pub(super) const fn new_in(offset: O, message: Option<Message>) -> Self {
Self {
offset,
msg: message,
_syntax: PhantomData,
_lang: PhantomData,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn of(offset: O) -> Self {
Self::new_in(offset, None)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_message_of(offset: O, msg: Message) -> Self {
Self::new_in(offset, Some(msg))
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn offset(&self) -> O
where
O: Copy,
{
self.offset
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn offset_ref(&self) -> &O {
&self.offset
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn offset_mut(&mut self) -> &mut O {
&mut self.offset
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn message(&self) -> Option<&Message> {
self.msg.as_ref()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn message_mut(&mut self) -> Option<&mut Message> {
self.msg.as_mut()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bump(&mut self, offset: &O)
where
O: for<'b> AddAssign<&'b O>,
{
self.offset += offset;
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn into_components(self) -> (O, Option<Message>) {
(self.offset, self.msg)
}
}
impl<Syntax, O, Lang> From<MissingSyntax<Syntax, O, Lang>> for () {
#[cfg_attr(not(tarpaulin), inline(always))]
fn from(_: MissingSyntax<Syntax, O, Lang>) -> Self {}
}
impl<Syntax, O, Lang> MissingSyntax<Syntax, O, Lang>
where
O: core::fmt::Debug,
Lang: ?Sized,
{
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn debug_fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("MissingSyntax")
.field("offset", &self.offset)
.field("message", &self.msg)
.finish()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn display_fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
where
O: core::fmt::Display,
{
match &self.msg {
Some(msg) => write!(f, "missing syntax at offset {}: {}", self.offset, msg),
None => write!(f, "missing syntax at offset {}", self.offset),
}
}
}