use std::fmt::{Display, Formatter, Result};
use crabstep::error::TypedStreamError;
use crate::error::{plist::PlistParseError, streamtyped::StreamTypedError};
#[derive(Debug)]
pub enum MessageError {
NoText,
StreamTypedParseError(StreamTypedError),
TypedStreamError(TypedStreamError),
PlistParseError(PlistParseError),
InvalidTimestamp(i64),
}
impl Display for MessageError {
fn fmt(&self, fmt: &mut Formatter<'_>) -> Result {
match self {
MessageError::NoText => write!(fmt, "Message has no text!"),
MessageError::StreamTypedParseError(why) => {
write!(
fmt,
"Failed to parse attributedBody with legacy parser: {why}"
)
}
MessageError::InvalidTimestamp(when) => {
write!(fmt, "Timestamp is invalid: {when}")
}
MessageError::TypedStreamError(typed_stream_error) => {
write!(
fmt,
"Failed to deserialize typed stream: {typed_stream_error}"
)
}
MessageError::PlistParseError(why) => {
write!(fmt, "Failed to parse property list: {why}")
}
}
}
}
impl std::error::Error for MessageError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
MessageError::StreamTypedParseError(e) => Some(e),
MessageError::TypedStreamError(e) => Some(e),
MessageError::PlistParseError(e) => Some(e),
_ => None,
}
}
}
impl From<StreamTypedError> for MessageError {
fn from(err: StreamTypedError) -> Self {
MessageError::StreamTypedParseError(err)
}
}
impl From<TypedStreamError> for MessageError {
fn from(err: TypedStreamError) -> Self {
MessageError::TypedStreamError(err)
}
}
impl From<PlistParseError> for MessageError {
fn from(err: PlistParseError) -> Self {
MessageError::PlistParseError(err)
}
}