diff options
Diffstat (limited to 'src/componentparameter.rs')
| -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 |
