diff options
| author | troido <troido@protonmail.com> | 2020-04-13 15:13:36 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-04-13 15:13:36 +0200 |
| commit | e8088a736a48cfb650df7f7a8f69e3e91922ca57 (patch) | |
| tree | 95f2738dd10aa7250fd6416f598340c4aec8710e /src | |
| parent | 2d4cabc768968a215556f7a4ed81a728d3b6e120 (diff) | |
added if conditions in assemblages
Diffstat (limited to 'src')
| -rw-r--r-- | src/componentparameter.rs | 31 |
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 |
