use crate::PhpVersion;
use php_ast::Span;
use std::borrow::Cow;
use thiserror::Error;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[non_exhaustive]
pub enum Severity {
#[default]
Error,
Warning,
}
#[derive(Debug, Clone, Error)]
#[non_exhaustive]
pub enum ParseError {
#[error("expected {expected}, found {found}")]
Expected {
expected: Cow<'static, str>,
found: Cow<'static, str>,
span: Span,
},
#[error("expected expression")]
ExpectedExpression {
span: Span,
},
#[error("expected statement")]
ExpectedStatement {
span: Span,
},
#[error("expected opening PHP tag")]
ExpectedOpenTag {
span: Span,
},
#[error("unterminated string literal")]
UnterminatedString {
span: Span,
},
#[error("expected {expected} after {after}")]
ExpectedAfter {
expected: Cow<'static, str>,
after: Cow<'static, str>,
span: Span,
},
#[error("expected {delimiter} to close the delimiter opened at byte {}", opened_at.start)]
UnclosedDelimiter {
delimiter: Cow<'static, str>,
opened_at: Span,
span: Span,
},
#[error("{message}")]
Forbidden {
message: Cow<'static, str>,
span: Span,
},
#[error("{message}")]
ForbiddenWarning {
message: Cow<'static, str>,
span: Span,
},
#[error("maximum nesting depth exceeded")]
NestingTooDeep {
span: Span,
},
#[error("source is {len} bytes; the maximum is 4 GiB")]
SourceTooLarge {
len: usize,
span: Span,
},
#[error("'{feature}' requires PHP {required} or higher")]
VersionTooLow {
feature: Cow<'static, str>,
required: PhpVersion,
used: PhpVersion,
span: Span,
},
}
impl ParseError {
pub fn span(&self) -> Span {
match self {
ParseError::Expected { span, .. }
| ParseError::ExpectedExpression { span }
| ParseError::ExpectedStatement { span }
| ParseError::ExpectedOpenTag { span }
| ParseError::UnterminatedString { span }
| ParseError::ExpectedAfter { span, .. }
| ParseError::UnclosedDelimiter { span, .. }
| ParseError::Forbidden { span, .. }
| ParseError::ForbiddenWarning { span, .. }
| ParseError::NestingTooDeep { span }
| ParseError::SourceTooLarge { span, .. }
| ParseError::VersionTooLow { span, .. } => *span,
}
}
pub fn severity(&self) -> Severity {
match self {
ParseError::ForbiddenWarning { .. } => Severity::Warning,
_ => Severity::Error,
}
}
}