summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/assemblage.rs2
-rw-r--r--src/componentparameter.rs23
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
})
}
}