summaryrefslogtreecommitdiff
path: root/src/assemblage.rs
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-09-28 21:34:12 +0200
committertroido <troido@protonmail.com>2020-09-28 21:34:12 +0200
commit5af83beb6f10023cef7eba192a0b190518fe967b (patch)
tree5d559de847d3492999496651ec52136dd31f58a4 /src/assemblage.rs
parentb7187e210ae7e794c87ae2f76d0f212e5d716b15 (diff)
better type validation and spawners set home argument on their spawned template
Diffstat (limited to 'src/assemblage.rs')
-rw-r--r--src/assemblage.rs38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/assemblage.rs b/src/assemblage.rs
index 773ebf0..24d4539 100644
--- a/src/assemblage.rs
+++ b/src/assemblage.rs
@@ -24,13 +24,12 @@ impl Assemblage {
pub fn validate(&self) -> AnyResult<()> {
- let arguments = self.arguments.iter().filter_map(|(k, v)|Some((k.clone(), v.clone()?))).collect::<HashMap<String, Parameter>>();
for (comptype, parameters) in &self.components {
let mut is_complete = true;
let mut compargs = HashMap::new();
for paramname in comptype.parameters() {
let param = parameters.get(paramname).ok_or(aerr!("missing parameter {} for component {:?}", paramname, comptype))?;
- match param.evaluate(&arguments, &Template::empty("")) {
+ match param.evaluate(&self.arguments, &Template::empty("")) {
Err(EvaluationError::MissingArgument(_)) => {is_complete = false;}
Err(EvaluationError::Other(msg)) => {return Err(aerr!("invalid value for {}: {}", paramname, msg))}
Ok(p) => {compargs.insert(paramname, p);}
@@ -45,18 +44,16 @@ impl Assemblage {
pub fn instantiate(&self, template: &Template) -> AnyResult<Vec<ComponentWrapper>>{
- let mut args = self.arguments.clone();
+ let mut arguments = self.arguments.clone();
for (key, param) in template.kwargs.clone() {
- // todo: warn about unknown keys
- args.insert(key, Some(param));
+ arguments.insert(key, Some(param));
}
- let arguments = args.into_iter().map(|(k, v)|Ok((k.clone(), v.ok_or(aerr!("missing argument value for {}", k))?))).collect::<AnyResult<HashMap<String, Parameter>>>()?;
let mut components: Vec<ComponentWrapper> = Vec::new();
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, template).map_err(|e| match e {
- EvaluationError::MissingArgument(arg) => aerr!("argument {} not found", arg),
+ EvaluationError::MissingArgument(arg) => aerr!("argument {} has no value", arg),
EvaluationError::Other(msg) => aerr!("{}", msg)
})?);
}
@@ -245,6 +242,33 @@ mod tests {
#[test]
+ fn unknown_argument(){
+ Assemblage::deserialize(&json!({
+ "arguments": {"name": "me"},
+ "components": [
+ ["Visible", {
+ "sprite": {"$arg": "sprite"},
+ "height": 0.1,
+ "name": "grass"
+ }]
+ ]
+ })).unwrap().validate().unwrap_err();
+ }
+
+ #[test]
+ fn missing_component_parameter(){
+ Assemblage::deserialize(&json!({
+ "arguments": {},
+ "components": [
+ ["Visible", {
+ "height": 0.1,
+ "name": "grass"
+ }]
+ ]
+ })).unwrap().validate().unwrap_err();
+ }
+
+ #[test]
fn null_argument(){
let result = Assemblage::deserialize(&json!({
"arguments": {"sprite": null},