From 7846b871f5c9d57a19dbf09b7acbf0d6b38a69ca Mon Sep 17 00:00:00 2001 From: troido Date: Thu, 5 Mar 2020 13:17:36 +0100 Subject: new componentparameters to get own template and name --- src/assemblage.rs | 2 +- src/componentparameter.rs | 23 ++++++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) (limited to 'src') 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), - Concat(Vec) + Concat(Vec), + TemplateSelf, + TemplateName } impl ComponentParameter { - pub fn evaluate(&self, arguments: &HashMap<&str, Parameter>) -> Option { - self.evaluate_(arguments, 0) + pub fn evaluate(&self, arguments: &HashMap<&str, Parameter>, template: &Template) -> Option { + self.evaluate_(arguments, template, 0) } - fn evaluate_(&self, arguments: &HashMap<&str, Parameter>, nesting: usize) -> Option { + fn evaluate_(&self, arguments: &HashMap<&str, Parameter>, template: &Template, nesting: usize) -> Option { 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 }) } } -- cgit