use std::fmt;
use qubit_common::DataType;
use qubit_value::{Value, ValueError};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MetadataError {
MissingKey(String),
TypeMismatch {
key: String,
expected: DataType,
actual: DataType,
message: String,
},
MissingRequiredField {
key: String,
expected: DataType,
},
UnknownField {
key: String,
},
UnknownFilterField {
key: String,
},
InvalidFilterOperator {
key: String,
operator: &'static str,
data_type: DataType,
message: String,
},
}
impl MetadataError {
#[inline]
pub(crate) fn conversion_error(
key: &str,
expected: DataType,
value: &Value,
error: ValueError,
) -> Self {
Self::TypeMismatch {
key: key.to_string(),
expected,
actual: value.data_type(),
message: error.to_string(),
}
}
#[inline]
pub(crate) fn type_mismatch(key: &str, expected: DataType, actual: DataType) -> Self {
Self::TypeMismatch {
key: key.to_string(),
expected,
actual,
message: format!("expected {expected}, got {actual}"),
}
}
}
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::TypeMismatch {
key,
expected,
actual,
message,
} => write!(
f,
"Metadata key '{key}' expected {expected} but actual {actual}: {message}"
),
Self::MissingRequiredField { key, expected } => write!(
f,
"Required metadata key '{key}' is missing (expected {expected})"
),
Self::UnknownField { key } => {
write!(f, "Metadata key '{key}' is not defined in schema")
}
Self::UnknownFilterField { key } => {
write!(
f,
"Metadata filter references key '{key}' not defined in schema"
)
}
Self::InvalidFilterOperator {
key,
operator,
data_type,
message,
} => write!(
f,
"Metadata filter operator '{operator}' is invalid for key '{key}' with type {data_type}: {message}"
),
}
}
}
impl std::error::Error for MetadataError {}