use crate::schema::canonical::ParseError;
use std::fmt::{Display, Formatter};
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum RenderError {
ValueMismatch { path: String, reason: String },
Unsupported(&'static str),
Canonical(ParseError),
Json(String),
UnexpectedField { record: String, field: String },
DuplicateFlag { flag: String },
UnionTagMismatch { tag: String, reason: String },
UnionAmbiguous { matched: Vec<String> },
UnionNoMatch,
}
impl Display for RenderError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
RenderError::ValueMismatch { path, reason } => {
write!(f, "value mismatch at {path}: {reason}")
}
RenderError::Unsupported(what) => write!(f, "unsupported: {what}"),
RenderError::Canonical(inner) => write!(f, "canonical: {inner}"),
RenderError::Json(msg) => write!(f, "json: {msg}"),
RenderError::UnexpectedField { record, field } => {
write!(f, "unexpected field `{field}` on record `{record}`")
}
RenderError::DuplicateFlag { flag } => write!(f, "duplicate flag `{flag}`"),
RenderError::UnionTagMismatch { tag, reason } => {
write!(
f,
"union branch `{tag}` rejected by discriminator: {reason}"
)
}
RenderError::UnionAmbiguous { matched } => write!(
f,
"value matches multiple union branches: {}",
matched.join(", ")
),
RenderError::UnionNoMatch => write!(f, "no union branch matched"),
}
}
}
impl std::error::Error for RenderError {}
impl From<ParseError> for RenderError {
fn from(value: ParseError) -> Self {
RenderError::Canonical(value)
}
}