use std::error::Error;
use std::fmt;
use super::JsonDecodeContext;
use super::JsonSyntaxErrorReason;
use crate::lexical::JsonLexicalFailure;
#[must_use]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct JsonSyntaxError {
offset: usize,
line: usize,
column: usize,
reason: JsonSyntaxErrorReason,
context: Option<JsonDecodeContext>,
}
impl JsonSyntaxError {
#[inline]
pub const fn new(offset: usize, line: usize, column: usize, reason: JsonSyntaxErrorReason) -> Self {
Self {
offset,
line,
column,
reason,
context: None,
}
}
pub(crate) fn from_lexical(failure: JsonLexicalFailure) -> Self {
let mut error = Self::new(failure.offset, failure.line, failure.column, failure.reason.into());
error.context = failure.context;
error
}
#[must_use]
#[inline(always)]
pub const fn context(&self) -> Option<JsonDecodeContext> {
self.context
}
#[must_use = "the updated syntax error must be used"]
#[inline(always)]
pub const fn with_context(mut self, context: JsonDecodeContext) -> Self {
self.context = Some(context);
self
}
#[must_use]
#[inline(always)]
pub const fn offset(&self) -> usize {
self.offset
}
#[must_use]
#[inline(always)]
pub const fn line(&self) -> usize {
self.line
}
#[must_use]
#[inline(always)]
pub const fn column(&self) -> usize {
self.column
}
#[inline(always)]
pub const fn reason(&self) -> JsonSyntaxErrorReason {
self.reason
}
}
impl fmt::Display for JsonSyntaxError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
formatter,
"{} at line {} column {} (byte offset {})",
self.reason, self.line, self.column, self.offset,
)
}
}
impl Error for JsonSyntaxError {}