summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-13 15:13:36 +0200
committertroido <troido@protonmail.com>2020-04-13 15:13:36 +0200
commite8088a736a48cfb650df7f7a8f69e3e91922ca57 (patch)
tree95f2738dd10aa7250fd6416f598340c4aec8710e /src
parent2d4cabc768968a215556f7a4ed81a728d3b6e120 (diff)
added if conditions in assemblages
Diffstat (limited to 'src')
-rw-r--r--src/componentparameter.rs31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/componentparameter.rs b/src/componentparameter.rs
index 47c9a26..333c6e1 100644
--- a/src/componentparameter.rs
+++ b/src/componentparameter.rs
@@ -20,6 +20,7 @@ pub enum ComponentParameter {
Argument(String),
Random(Vec<ComponentParameter>),
Concat(Vec<ComponentParameter>),
+ If(Box<ComponentParameter>, Box<ComponentParameter>, Box<ComponentParameter>),
TemplateSelf,
TemplateName
}
@@ -56,6 +57,17 @@ impl ComponentParameter {
}
Some(Parameter::String(string))
}
+ Self::If(condition, thenval, elseval) => {
+ if let Parameter::Bool(b) = condition.evaluate_(arguments, template, nesting+1)? {
+ if b {
+ thenval.evaluate_(arguments, template, nesting+1)
+ } else {
+ elseval.evaluate_(arguments, template, nesting+1)
+ }
+ } else {
+ None
+ }
+ }
Self::TemplateSelf => Some(Parameter::Template(template.clone())),
Self::TemplateName => Some(Parameter::String(template.name.0.clone())),
@@ -94,6 +106,13 @@ impl ComponentParameter {
}
Ok(Self::Concat(options))
},
+ "if" => {
+ Ok(Self::If(
+ Box::new(Self::from_json(paramvalue.get(0).ok_or(perr!("if does not have condition"))?)?),
+ Box::new(Self::from_json(paramvalue.get(1).ok_or(perr!("if does not have then value"))?)?),
+ Box::new(Self::from_json(paramvalue.get(2).ok_or(perr!("if does not have else value"))?)?)
+ ))
+ }
"self" => Ok(Self::TemplateSelf),
"name" => Ok(Self::TemplateName),
_ => Err(perr!("unknown compparam type '{}'", typename))
@@ -109,11 +128,21 @@ impl ComponentParameter {
let typ: ParameterType = options.get(0).ok_or(aerr!("random has no options"))?.get_type(arguments)?;
for param in options {
if param.get_type(arguments)? != typ {
- return Err(aerr!("inconsistent parameter types"));
+ return Err(aerr!("inconsistent parameter types in random"));
}
}
typ
},
+ Self::If(condition, thenval, elseval) => {
+ if condition.get_type(arguments)? != ParameterType::Bool {
+ return Err(aerr!("if condition is not a bool"));
+ }
+ let typ: ParameterType = thenval.get_type(arguments)?;
+ if elseval.get_type(arguments)? != typ {
+ return Err(aerr!("inconsistent parameter types in if"));
+ }
+ typ
+ },
Self::Concat(_s) => ParameterType::String,
Self::TemplateSelf => ParameterType::Template,
Self::TemplateName => ParameterType::String