substrate_data/schema/reader/
expand.rs1use super::Reader;
4use crate::diagnostic::Problem;
5use crate::model::value::{Ref, Value};
6
7pub const MAX_EXPANSION_DEPTH: usize = 32;
11
12#[derive(Debug, Clone, PartialEq)]
14pub enum Expansion {
15 Kept,
17 Value(Value),
19 Failed,
21}
22
23impl Reader<'_> {
24 pub fn expand_ref(&mut self, r: &Ref) -> Expansion {
27 let path = self.path();
28 let Some(resolver) = self.resolver.as_mut() else {
29 return Expansion::Kept;
30 };
31 match resolver.expand(r, &path) {
32 Ok(Some(value)) => Expansion::Value(value),
33 Ok(None) => Expansion::Kept,
34 Err(e) => {
35 self.problem_of(Problem::Unresolved, e.to_string());
36 Expansion::Failed
37 }
38 }
39 }
40
41 pub fn expanded<T>(&mut self, f: impl FnOnce(&mut Self) -> Option<T>) -> Option<T> {
44 if self.expanding >= MAX_EXPANSION_DEPTH {
45 self.problem(format!(
46 "references expand into one another more than {MAX_EXPANSION_DEPTH} deep"
47 ));
48 return None;
49 }
50 self.expanding += 1;
51 let read = f(self);
52 self.expanding -= 1;
53 read
54 }
55}