use std::error::Error;
use std::fmt;
use std::io::Error as IoError;
use qubit_budget::MeasuredBudgetError;
use super::JsonEncodeErrorKind;
use super::JsonEncodeErrorSource;
use super::JsonSerializationError;
use super::internal::JsonEncodeFailure;
use crate::decode::JsonSyntaxError;
#[must_use]
#[derive(Debug)]
pub struct JsonEncodeError<R, Q = usize>
where
Q: Copy + fmt::Debug,
{
failure: JsonEncodeFailure<R, Q>,
}
impl<R, Q> JsonEncodeError<R, Q>
where
Q: Copy + fmt::Debug,
{
#[must_use = "return or inspect the constructed encoding error"]
pub(crate) const fn budget(source: MeasuredBudgetError<R, Q>) -> Self {
Self {
failure: JsonEncodeFailure::Budget(source),
}
}
#[must_use = "return or inspect the constructed encoding error"]
pub(crate) const fn invalid_raw_json(source: JsonSyntaxError) -> Self {
Self {
failure: JsonEncodeFailure::InvalidRawJson(source),
}
}
#[must_use = "return or inspect the constructed encoding error"]
pub(crate) const fn serialization(source: JsonSerializationError) -> Self {
Self {
failure: JsonEncodeFailure::Serialize(source),
}
}
#[must_use = "return or inspect the constructed encoding error"]
pub(crate) fn write(source: IoError) -> Self {
Self {
failure: JsonEncodeFailure::Write(source),
}
}
#[must_use]
#[inline(always)]
pub const fn kind(&self) -> JsonEncodeErrorKind {
match self.failure {
JsonEncodeFailure::Budget(_) => JsonEncodeErrorKind::Budget,
JsonEncodeFailure::InvalidRawJson(_) => JsonEncodeErrorKind::InvalidRawJson,
JsonEncodeFailure::Serialize(_) => JsonEncodeErrorKind::Serialize,
JsonEncodeFailure::Write(_) => JsonEncodeErrorKind::Write,
}
}
#[must_use]
#[inline(always)]
pub const fn budget_error(&self) -> Option<&MeasuredBudgetError<R, Q>> {
match &self.failure {
JsonEncodeFailure::Budget(source) => Some(source),
_ => None,
}
}
#[must_use]
#[inline(always)]
pub const fn syntax_error(&self) -> Option<&JsonSyntaxError> {
match &self.failure {
JsonEncodeFailure::InvalidRawJson(source) => Some(source),
_ => None,
}
}
#[must_use]
#[inline(always)]
pub const fn serialization_error(&self) -> Option<&JsonSerializationError> {
match &self.failure {
JsonEncodeFailure::Serialize(source) => Some(source),
_ => None,
}
}
#[must_use]
#[inline(always)]
pub const fn write_error(&self) -> Option<&IoError> {
match &self.failure {
JsonEncodeFailure::Write(source) => Some(source),
_ => None,
}
}
#[must_use]
pub fn into_budget_error(self) -> Option<MeasuredBudgetError<R, Q>> {
match self.failure {
JsonEncodeFailure::Budget(source) => Some(source),
_ => None,
}
}
#[must_use]
pub fn into_syntax_error(self) -> Option<JsonSyntaxError> {
match self.failure {
JsonEncodeFailure::InvalidRawJson(source) => Some(source),
_ => None,
}
}
#[must_use]
pub fn into_serialization_error(self) -> Option<JsonSerializationError> {
match self.failure {
JsonEncodeFailure::Serialize(source) => Some(source),
_ => None,
}
}
#[must_use]
pub fn into_write_error(self) -> Option<IoError> {
match self.failure {
JsonEncodeFailure::Write(source) => Some(source),
_ => None,
}
}
#[inline(always)]
pub fn into_source(self) -> JsonEncodeErrorSource<R, Q> {
self.failure
}
}
impl<R, Q> From<MeasuredBudgetError<R, Q>> for JsonEncodeError<R, Q>
where
Q: Copy + fmt::Debug,
{
#[inline(always)]
fn from(source: MeasuredBudgetError<R, Q>) -> Self {
Self::budget(source)
}
}
impl<R, Q> fmt::Display for JsonEncodeError<R, Q>
where
R: fmt::Debug,
Q: Copy + fmt::Debug + fmt::Display,
{
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match &self.failure {
JsonEncodeFailure::Budget(source) => fmt::Display::fmt(source, formatter),
JsonEncodeFailure::InvalidRawJson(source) => {
write!(formatter, "JSON raw value is invalid: {source}")
}
JsonEncodeFailure::Serialize(source) => {
write!(formatter, "JSON serialization failed: {source}")
}
JsonEncodeFailure::Write(source) => {
write!(formatter, "JSON output writer failed: {source}")
}
}
}
}
impl<R, Q> Error for JsonEncodeError<R, Q>
where
R: fmt::Debug + 'static,
Q: Copy + fmt::Debug + fmt::Display + 'static,
{
fn source(&self) -> Option<&(dyn Error + 'static)> {
match &self.failure {
JsonEncodeFailure::Budget(source) => Some(source),
JsonEncodeFailure::InvalidRawJson(source) => Some(source),
JsonEncodeFailure::Serialize(source) => Some(source),
JsonEncodeFailure::Write(source) => Some(source),
}
}
}