use std::fmt;
use crate::model::value::{Path, Ref, RefKey, Value};
pub trait Resolve {
fn reference(&mut self, r: &Ref, path: &Path) -> Result<RefKey, Unresolved>;
fn expand(&mut self, _r: &Ref, _path: &Path) -> Result<Option<Value>, Unresolved> {
Ok(None)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Unresolved {
Missing(Ref),
Refused {
reference: Ref,
reason: String,
},
}
impl fmt::Display for Unresolved {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Unresolved::Missing(r) => write!(f, "`{r}`: there is no such {}", r.kind),
Unresolved::Refused { reference, reason } => write!(f, "`{reference}`: {reason}"),
}
}
}
impl std::error::Error for Unresolved {}