use core::error::Error;
use crate::allocation::AllocationError;
use crate::bytes::{NonAsciiCodeByte, NonPrintableCodeByte, PayloadByteCount, ReservedSyntaxByte};
use crate::inspect::RuleCount;
use crate::limits::{
CodeLineByteCount, CodeLineByteLimit, PayloadByteLimit, RuleLimit, SourceByteCount,
SourceByteLimit,
};
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::Representation(error) => Some(error),
ParseErrorKind::InternalInvariant(error) => Some(error),
ParseErrorKind::Limit(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),
Representation(ParseRepresentationError),
InternalInvariant(ParseInvariantError),
Limit(ParseLimitError),
NonAsciiInCode {
byte: NonAsciiCodeByte,
},
NonPrintableAsciiInCode {
byte: NonPrintableCodeByte,
},
MissingEquals,
MultipleEquals,
ReservedSyntaxInPayload {
byte: ReservedSyntaxByte,
payload_kind: PayloadKind,
},
UnsupportedLeftModifierOrder {
modifier: LeftModifierKind,
},
UnsupportedRightActionSyntax {
action: RightActionKind,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ParseRepresentationError {
SourceLineNumber,
SourceColumn {
line: SourceLineNumber,
},
RulePosition,
RuleCount,
OnceRuleCount,
CompactCodeByteCount,
}
impl Error for ParseRepresentationError {}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ParseInvariantError {
RejectedNonAsciiCodeByteWithoutWitness,
MatchedTokenWithoutColumn,
ValidatedPayloadWithoutBytes,
}
impl Error for ParseInvariantError {}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ParseLimitError {
Source {
limit: SourceByteLimit,
attempted_len: SourceByteCount,
},
CodeLine {
limit: CodeLineByteLimit,
attempted_len: CodeLineByteCount,
},
Payload {
limit: PayloadByteLimit,
attempted_len: PayloadByteCount,
},
Rules {
limit: RuleLimit,
attempted_count: RuleCount,
},
}
impl ParseLimitError {
pub(crate) const fn source(limit: SourceByteLimit, attempted_len: SourceByteCount) -> Self {
Self::Source {
limit,
attempted_len,
}
}
pub(crate) const fn code_line(
limit: CodeLineByteLimit,
attempted_len: CodeLineByteCount,
) -> Self {
Self::CodeLine {
limit,
attempted_len,
}
}
pub(crate) const fn payload(limit: PayloadByteLimit, attempted_len: PayloadByteCount) -> Self {
Self::Payload {
limit,
attempted_len,
}
}
pub(crate) const fn rules(limit: RuleLimit, attempted_count: RuleCount) -> Self {
Self::Rules {
limit,
attempted_count,
}
}
}
impl Error for ParseLimitError {}
#[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,
}