use std::fmt::Display;
use thiserror::Error;
use super::JsonCollectionKind;
use super::JsonIntegerSignedness;
use super::JsonMapKeyKind;
use super::JsonSerializationErrorCategory;
use super::JsonSerializationErrorKind;
use super::JsonSerializerStateError;
#[must_use]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Error)]
#[error("{kind}")]
pub struct JsonSerializationError {
kind: JsonSerializationErrorKind,
}
impl JsonSerializationError {
#[inline(always)]
pub const fn new(kind: JsonSerializationErrorKind) -> Self {
Self { kind }
}
#[must_use]
#[inline(always)]
pub const fn kind(&self) -> JsonSerializationErrorKind {
self.kind
}
#[must_use]
pub const fn category(&self) -> JsonSerializationErrorCategory {
match self.kind {
JsonSerializationErrorKind::IntegerOutOfRange { .. }
| JsonSerializationErrorKind::NonFiniteFloat
| JsonSerializationErrorKind::InvalidNumberRepresentation => JsonSerializationErrorCategory::Number,
JsonSerializationErrorKind::UnsupportedMapKey { .. } | JsonSerializationErrorKind::DuplicateObjectKey => {
JsonSerializationErrorCategory::ObjectKey
}
JsonSerializationErrorKind::InvalidRawValue => JsonSerializationErrorCategory::RawValue,
JsonSerializationErrorKind::CollectionLengthOverflow { .. } => JsonSerializationErrorCategory::Capacity,
JsonSerializationErrorKind::InvalidSerializerState { .. }
| JsonSerializationErrorKind::DisplayFormattingFailed => JsonSerializationErrorCategory::SerializerContract,
JsonSerializationErrorKind::CustomSerialization => JsonSerializationErrorCategory::Custom,
}
}
#[must_use]
#[inline(always)]
pub const fn is_number_error(&self) -> bool {
matches!(self.category(), JsonSerializationErrorCategory::Number)
}
#[must_use]
#[inline(always)]
pub const fn is_map_key_error(&self) -> bool {
matches!(self.category(), JsonSerializationErrorCategory::ObjectKey)
}
#[must_use]
#[inline(always)]
pub const fn is_raw_value_error(&self) -> bool {
matches!(self.category(), JsonSerializationErrorCategory::RawValue)
}
#[must_use]
#[inline(always)]
pub const fn is_serializer_contract_error(&self) -> bool {
matches!(self.category(), JsonSerializationErrorCategory::SerializerContract)
}
#[must_use]
#[inline(always)]
pub const fn integer_signedness(&self) -> Option<JsonIntegerSignedness> {
match self.kind {
JsonSerializationErrorKind::IntegerOutOfRange { signedness } => Some(signedness),
_ => None,
}
}
#[must_use]
#[inline(always)]
pub const fn map_key_kind(&self) -> Option<JsonMapKeyKind> {
match self.kind {
JsonSerializationErrorKind::UnsupportedMapKey { kind } => Some(kind),
_ => None,
}
}
#[must_use]
#[inline(always)]
pub const fn collection_kind(&self) -> Option<JsonCollectionKind> {
match self.kind {
JsonSerializationErrorKind::CollectionLengthOverflow { kind } => Some(kind),
_ => None,
}
}
#[must_use]
#[inline(always)]
pub const fn serializer_state_error(&self) -> Option<JsonSerializerStateError> {
match self.kind {
JsonSerializationErrorKind::InvalidSerializerState { reason } => Some(reason),
_ => None,
}
}
}
impl serde::ser::Error for JsonSerializationError {
fn custom<T>(_message: T) -> Self
where
T: Display,
{
Self::new(JsonSerializationErrorKind::CustomSerialization)
}
}