use super::Reader;
use crate::diagnostic::Problem;
use crate::model::value::{Ref, Value};
pub const MAX_EXPANSION_DEPTH: usize = 32;
#[derive(Debug, Clone, PartialEq)]
pub enum Expansion {
Kept,
Value(Value),
Failed,
}
impl Reader<'_> {
pub fn expand_ref(&mut self, r: &Ref) -> Expansion {
let path = self.path();
let Some(resolver) = self.resolver.as_mut() else {
return Expansion::Kept;
};
match resolver.expand(r, &path) {
Ok(Some(value)) => Expansion::Value(value),
Ok(None) => Expansion::Kept,
Err(e) => {
self.problem_of(Problem::Unresolved, e.to_string());
Expansion::Failed
}
}
}
pub fn expanded<T>(&mut self, f: impl FnOnce(&mut Self) -> Option<T>) -> Option<T> {
if self.expanding >= MAX_EXPANSION_DEPTH {
self.problem(format!(
"references expand into one another more than {MAX_EXPANSION_DEPTH} deep"
));
return None;
}
self.expanding += 1;
let read = f(self);
self.expanding -= 1;
read
}
}