use std::fmt;
use serde_json::Value;
use crate::metadata_value_type::MetadataValueType;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MetadataError {
MissingKey(String),
SerializationError {
key: String,
message: String,
},
DeserializationError {
key: String,
expected: &'static str,
actual: MetadataValueType,
message: String,
},
}
impl MetadataError {
#[inline]
pub(crate) fn deserialization_error<T>(
key: &str,
value: &Value,
error: serde_json::Error,
) -> Self {
Self::DeserializationError {
key: key.to_string(),
expected: std::any::type_name::<T>(),
actual: MetadataValueType::of(value),
message: error.to_string(),
}
}
#[inline]
pub(crate) fn serialization_error(key: String, error: serde_json::Error) -> Self {
Self::SerializationError {
key,
message: error.to_string(),
}
}
}
impl fmt::Display for MetadataError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::MissingKey(key) => write!(f, "Metadata key not found: {key}"),
Self::SerializationError { key, message } => {
write!(f, "Failed to serialize metadata value for key '{key}': {message}")
}
Self::DeserializationError {
key,
expected,
actual,
message,
} => write!(
f,
"Failed to deserialize metadata key '{key}' as {expected} from JSON {actual}: {message}"
),
}
}
}
impl std::error::Error for MetadataError {}