use core::error::Error;
use crate::allocation::AllocationError;
use crate::source::{SourceColumn, SourceLineNumber, SourcePosition};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ParseError {
line: SourceLineNumber,
column: Option<SourceColumn>,
kind: ParseErrorKind,
}
impl ParseError {
pub(crate) fn new(
line: SourceLineNumber,
column: Option<SourceColumn>,
kind: ParseErrorKind,
) -> Self {
Self { line, column, kind }
}
#[must_use]
pub const fn line(&self) -> SourceLineNumber {
self.line
}
#[must_use]
pub const fn column(&self) -> Option<SourceColumn> {
self.column
}
#[must_use]
pub const fn position(&self) -> Option<SourcePosition> {
match self.column {
Some(column) => Some(SourcePosition::new(self.line, column)),
None => None,
}
}
#[must_use]
pub const fn kind(&self) -> &ParseErrorKind {
&self.kind
}
}
impl Error for ParseError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match &self.kind {
ParseErrorKind::Allocation(error) => Some(error),
ParseErrorKind::NonAsciiInCode { .. }
| ParseErrorKind::NonPrintableAsciiInCode { .. }
| ParseErrorKind::MissingEquals
| ParseErrorKind::MultipleEquals
| ParseErrorKind::ReservedSyntaxInPayload { .. }
| ParseErrorKind::UnsupportedLeftModifierOrder { .. }
| ParseErrorKind::UnsupportedRightActionSyntax { .. } => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ParseErrorKind {
Allocation(AllocationError),
NonAsciiInCode { byte: u8 },
NonPrintableAsciiInCode { byte: u8 },
MissingEquals,
MultipleEquals,
ReservedSyntaxInPayload { byte: u8, payload_kind: PayloadKind },
UnsupportedLeftModifierOrder { modifier: LeftModifierKind },
UnsupportedRightActionSyntax { action: RightActionKind },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PayloadKind {
LeftSideData,
RightSideData,
RightSideMoveStartPayload,
RightSideMoveEndPayload,
RightSideReturnPayload,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LeftModifierKind {
Once,
Start,
End,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RightActionKind {
Start,
End,
Return,
}