use core::error::Error;
use crate::allocation::AllocationError;
use crate::bytes::{NonAsciiCodeByte, NonPrintableCodeByte, ReservedSyntaxByte};
use crate::source::{SourceLineNumber, SourcePosition};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ParseError {
location: ParseErrorLocation,
kind: ParseErrorKind,
}
impl ParseError {
pub(crate) const fn at_line(line: SourceLineNumber, kind: ParseErrorKind) -> Self {
Self {
location: ParseErrorLocation::Line(line),
kind,
}
}
pub(crate) const fn at_position(position: SourcePosition, kind: ParseErrorKind) -> Self {
Self {
location: ParseErrorLocation::Position(position),
kind,
}
}
#[must_use]
pub const fn location(&self) -> ParseErrorLocation {
self.location
}
#[must_use]
pub const fn line(&self) -> SourceLineNumber {
match self.location {
ParseErrorLocation::Line(line) => line,
ParseErrorLocation::Position(position) => position.line(),
}
}
#[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, Copy, PartialEq, Eq)]
pub enum ParseErrorLocation {
Line(SourceLineNumber),
Position(SourcePosition),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ParseErrorKind {
Allocation(AllocationError),
NonAsciiInCode {
byte: NonAsciiCodeByte,
},
NonPrintableAsciiInCode {
byte: NonPrintableCodeByte,
},
MissingEquals,
MultipleEquals,
ReservedSyntaxInPayload {
byte: ReservedSyntaxByte,
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,
}