use std::fmt;
#[derive(Debug, thiserror::Error)]
pub enum LexiconError {
#[error("invalid schema: {0}")]
InvalidSchema(String),
#[error("JSON parse error: {0}")]
Json(#[from] serde_json::Error),
}
#[derive(Debug)]
pub enum ValidationError {
Field {
path: String,
kind: ValidationErrorKind,
},
UnknownCollection(String),
Schema(String),
Multiple(Vec<ValidationError>),
}
impl fmt::Display for ValidationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ValidationError::Field { path, kind } => write!(f, "at {path}: {kind}"),
ValidationError::UnknownCollection(nsid) => write!(f, "unknown collection: {nsid}"),
ValidationError::Schema(msg) => write!(f, "schema error: {msg}"),
ValidationError::Multiple(errs) => {
for (i, e) in errs.iter().enumerate() {
if i > 0 {
writeln!(f)?;
}
write!(f, "{e}")?;
}
Ok(())
}
}
}
}
impl std::error::Error for ValidationError {}
#[derive(Debug, thiserror::Error)]
pub enum ValidationErrorKind {
#[error("required field missing")]
Required,
#[error("expected {expected}, got {got}")]
TypeMismatch { expected: String, got: String },
#[error("string too short: min {min}, got {got}")]
TooShort { min: u64, got: u64 },
#[error("string too long: max {max}, got {got}")]
TooLong { max: u64, got: u64 },
#[error("integer out of range")]
OutOfRange,
#[error("value not in enum: {got}")]
InvalidEnum { got: String },
#[error("{0}")]
Other(String),
}