presets: parse depth first to allow for proper override behaviour
This commit is contained in:
parent
b1a6952020
commit
e2e6357cfb
1 changed files with 13 additions and 7 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
use std::collections::VecDeque;
|
||||||
use crate::error::{ParseErrorKind, ParsePresetError};
|
use crate::error::{ParseErrorKind, ParsePresetError};
|
||||||
use crate::parse::{remove_if, Span, Token};
|
use crate::parse::{remove_if, Span, Token};
|
||||||
use crate::{ScaleFactor, ScaleType};
|
use crate::{ScaleFactor, ScaleType};
|
||||||
|
@ -154,9 +155,11 @@ fn load_child_reference_strings(
|
||||||
let root_path = root_path.as_ref();
|
let root_path = root_path.as_ref();
|
||||||
|
|
||||||
let mut reference_depth = 0;
|
let mut reference_depth = 0;
|
||||||
let mut reference_strings: Vec<(PathBuf, String)> = Vec::new();
|
let mut reference_strings: VecDeque<(PathBuf, String)> = VecDeque::new();
|
||||||
let mut root_references = vec![(root_path.to_path_buf(), root_references)];
|
let root_references = vec![(root_path.to_path_buf(), root_references)];
|
||||||
while let Some((reference_root, referenced_paths)) = root_references.pop() {
|
let mut root_references = VecDeque::from(root_references);
|
||||||
|
// search needs to be depth first to allow for overrides.
|
||||||
|
while let Some((reference_root, referenced_paths)) = root_references.pop_front() {
|
||||||
if reference_depth > SHADER_MAX_REFERENCE_DEPTH {
|
if reference_depth > SHADER_MAX_REFERENCE_DEPTH {
|
||||||
return Err(ParsePresetError::ExceededReferenceDepth);
|
return Err(ParsePresetError::ExceededReferenceDepth);
|
||||||
}
|
}
|
||||||
|
@ -189,14 +192,14 @@ fn load_child_reference_strings(
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
path.pop();
|
path.pop();
|
||||||
reference_strings.push((path.clone(), reference_contents));
|
reference_strings.push_front((path.clone(), reference_contents));
|
||||||
if !new_references.is_empty() {
|
if !new_references.is_empty() {
|
||||||
root_references.push((path, new_references));
|
root_references.push_front((path, new_references));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(reference_strings)
|
Ok(reference_strings.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_preset(path: impl AsRef<Path>) -> Result<Vec<Value>, ParsePresetError> {
|
pub fn parse_preset(path: impl AsRef<Path>) -> Result<Vec<Value>, ParsePresetError> {
|
||||||
|
@ -236,14 +239,17 @@ pub fn parse_values(
|
||||||
// unfortunately we need to lex twice because there's no way to know the references ahead of time.
|
// unfortunately we need to lex twice because there's no way to know the references ahead of time.
|
||||||
let child_strings = load_child_reference_strings(references, &root_path)?;
|
let child_strings = load_child_reference_strings(references, &root_path)?;
|
||||||
let mut all_tokens: Vec<(&Path, Vec<Token>)> = Vec::new();
|
let mut all_tokens: Vec<(&Path, Vec<Token>)> = Vec::new();
|
||||||
all_tokens.push((root_path.as_path(), tokens));
|
|
||||||
|
|
||||||
for (path, string) in child_strings.iter() {
|
for (path, string) in child_strings.iter() {
|
||||||
|
// lex the child tokens
|
||||||
let mut tokens = do_lex(string.as_ref())?;
|
let mut tokens = do_lex(string.as_ref())?;
|
||||||
tokens.retain(|token| *token.key.fragment() != "#reference");
|
tokens.retain(|token| *token.key.fragment() != "#reference");
|
||||||
all_tokens.push((path.as_path(), tokens))
|
all_tokens.push((path.as_path(), tokens))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// load depth first, so all child tokens are first.
|
||||||
|
// Later tokens take precedence.
|
||||||
|
all_tokens.push((root_path.as_path(), tokens));
|
||||||
// collect all possible parameter names.
|
// collect all possible parameter names.
|
||||||
let mut parameter_names: Vec<&str> = Vec::new();
|
let mut parameter_names: Vec<&str> = Vec::new();
|
||||||
for (_, tokens) in all_tokens.iter_mut() {
|
for (_, tokens) in all_tokens.iter_mut() {
|
||||||
|
|
Loading…
Add table
Reference in a new issue