diff options
| author | troido <troido@protonmail.com> | 2020-03-05 13:17:36 +0100 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-03-05 13:17:36 +0100 |
| commit | 7846b871f5c9d57a19dbf09b7acbf0d6b38a69ca (patch) | |
| tree | 0e81bd4b9da194ebbcf85b9c61578dbf17bb8013 /src | |
| parent | 170741fe959d30ee43ce689fd5fbae725cc1dae4 (diff) | |
new componentparameters to get own template and name
Diffstat (limited to 'src')
| -rw-r--r-- | src/assemblage.rs | 2 | ||||
| -rw-r--r-- | src/componentparameter.rs | 23 |
2 files changed, 17 insertions, 8 deletions
diff --git a/src/assemblage.rs b/src/assemblage.rs index 0f95f18..93d89a0 100644 --- a/src/assemblage.rs +++ b/src/assemblage.rs @@ -134,7 +134,7 @@ impl Assemblage { for (comptype, compparams) in &self.components { let mut compargs: HashMap<&str, Parameter> = HashMap::new(); for (name, param) in compparams { - compargs.insert(name.as_str(), param.evaluate(&arguments).ok_or(aerr!("argument not found"))?); + compargs.insert(name.as_str(), param.evaluate(&arguments, template).ok_or(aerr!("argument not found"))?); } components.push(ComponentWrapper::load_component(*comptype, compargs).ok_or(aerr!("failed to load component"))?); } diff --git a/src/componentparameter.rs b/src/componentparameter.rs index fdbfc71..bcf42e9 100644 --- a/src/componentparameter.rs +++ b/src/componentparameter.rs @@ -4,6 +4,7 @@ use rand::Rng; use serde_json::Value; use crate::{ parameter::{Parameter, ParameterType}, + Template, Result, aerr }; @@ -16,16 +17,18 @@ pub enum ComponentParameter { Constant(Parameter), Argument(String), Random(Vec<ComponentParameter>), - Concat(Vec<ComponentParameter>) + Concat(Vec<ComponentParameter>), + TemplateSelf, + TemplateName } impl ComponentParameter { - pub fn evaluate(&self, arguments: &HashMap<&str, Parameter>) -> Option<Parameter> { - self.evaluate_(arguments, 0) + pub fn evaluate(&self, arguments: &HashMap<&str, Parameter>, template: &Template) -> Option<Parameter> { + self.evaluate_(arguments, template, 0) } - fn evaluate_(&self, arguments: &HashMap<&str, Parameter>, nesting: usize) -> Option<Parameter> { + fn evaluate_(&self, arguments: &HashMap<&str, Parameter>, template: &Template, nesting: usize) -> Option<Parameter> { if nesting > MAX_NESTING { return None; } @@ -38,12 +41,12 @@ impl ComponentParameter { } Self::Random(options) => { let r = rand::thread_rng().gen_range(0, options.len()); - options[r].evaluate_(arguments, nesting + 1) + options[r].evaluate_(arguments, template, nesting + 1) } Self::Concat(options) => { let mut string = String::new(); for option in options { - if let Parameter::String(s) = option.evaluate_(arguments, nesting+1)? { + if let Parameter::String(s) = option.evaluate_(arguments, template, nesting+1)? { string.push_str(&s); } else { return None; @@ -51,6 +54,8 @@ impl ComponentParameter { } Some(Parameter::String(string)) } + Self::TemplateSelf => Some(Parameter::Template(template.clone())), + Self::TemplateName => Some(Parameter::String(template.name.0.clone())) } } @@ -83,6 +88,8 @@ impl ComponentParameter { } Ok(Self::Concat(options)) }, + "self" => Ok(Self::TemplateSelf), + "name" => Ok(Self::TemplateName), _ => Err(aerr!("unknown compparam type")) } } @@ -101,7 +108,9 @@ impl ComponentParameter { } typ }, - Self::Concat(_s) => ParameterType::String + Self::Concat(_s) => ParameterType::String, + Self::TemplateSelf => ParameterType::Template, + Self::TemplateName => ParameterType::String }) } } |
