diff options
| author | troido <troido@protonmail.com> | 2020-04-02 15:10:53 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-04-02 15:10:53 +0200 |
| commit | 1e8fe74740fc4fb11b660415b2db182c6a63a3c2 (patch) | |
| tree | df077b33f0aa5da69d3377672589838dee604356 /src/assemblage.rs | |
| parent | 4f9932074a8f0390d5cb6072b4e419c7ab08ffed (diff) | |
short value for flags; radish plants now have occupied flag
Diffstat (limited to 'src/assemblage.rs')
| -rw-r--r-- | src/assemblage.rs | 76 |
1 files changed, 49 insertions, 27 deletions
diff --git a/src/assemblage.rs b/src/assemblage.rs index ffb1420..95988cc 100644 --- a/src/assemblage.rs +++ b/src/assemblage.rs @@ -80,41 +80,20 @@ impl Assemblage { Ok(()) } - pub fn from_json(val: &Value) -> Result<Self>{ - let mut assemblage = Self { - arguments: Self::parse_definition_arguments(val.get("arguments").unwrap_or(&json!([])))?, - components: Self::parse_definition_components(val.get("components").unwrap_or(&json!([])))?, - save: val.get("save").unwrap_or(&json!(true)).as_bool().ok_or(aerr!("assemblage save not a bool"))?, - extract: val - .get("extract") - .unwrap_or(&json!({})) - .as_object().ok_or(aerr!("assemblage extract not a bool"))? - .into_iter() - .map(|(argname, val)| { - Ok(( - argname.to_string(), - ComponentType::from_str( - val - .get(0).ok_or(aerr!("index 0 not in extract value"))? - .as_str().ok_or(aerr!("extract component name not a string"))? - ).ok_or(aerr!("extract invalid component name"))?, - val.get(1) - .ok_or(aerr!("index 1 not in extract value"))? - .as_str().ok_or(aerr!("extract member name not a string"))?.to_string() - )) - }) - .collect::<Result<Vec<(String, ComponentType, String)>>>()? - }; + fn common_short_definitions(val: &Value) -> Result<Vec<(ComponentType, HashMap<String, ComponentParameter>)>> { + let mut components = Vec::new(); + let name = if let Some(nameval) = val.get("name") { Some(nameval.as_str().ok_or(aerr!("name not a string"))?.to_string()) } else {None}; + // visible component is so common that shortcuts are very helpful if let Some(spritename) = val.get("sprite") { let sprite = spritename.as_str().ok_or(aerr!("sprite not a string"))?.to_string(); let height = val .get("height").ok_or(aerr!("defining a sprite requires also defining a height"))? .as_f64().ok_or(aerr!("height not a float"))?; - assemblage.components.push(( + components.push(( ComponentType::Visible, hashmap!( "name".to_string() => ComponentParameter::Constant( @@ -129,9 +108,10 @@ impl Assemblage { ) )); } + // item component is common too if let Some(action) = val.get("item") { - assemblage.components.push(( + components.push(( ComponentType::Item, hashmap!( "ent".to_string() => ComponentParameter::TemplateSelf, @@ -146,6 +126,48 @@ impl Assemblage { ) )); } + + // and so is flags + if let Some(flags) = val.get("flags") { + components.push(( + ComponentType::Flags, + hashmap!( + "flags".to_string() => ComponentParameter::Constant( + Parameter::from_typed_json(ParameterType::Strings, flags).ok_or(aerr!("failed to parse flags"))? + ) + ) + )); + } + + Ok(components) + } + + pub fn from_json(val: &Value) -> Result<Self>{ + let mut assemblage = Self { + arguments: Self::parse_definition_arguments(val.get("arguments").unwrap_or(&json!([])))?, + components: Self::parse_definition_components(val.get("components").unwrap_or(&json!([])))?, + save: val.get("save").unwrap_or(&json!(true)).as_bool().ok_or(aerr!("assemblage save not a bool"))?, + extract: val + .get("extract") + .unwrap_or(&json!({})) + .as_object().ok_or(aerr!("assemblage extract not a bool"))? + .into_iter() + .map(|(argname, val)| { + Ok(( + argname.to_string(), + ComponentType::from_str( + val + .get(0).ok_or(aerr!("index 0 not in extract value"))? + .as_str().ok_or(aerr!("extract component name not a string"))? + ).ok_or(aerr!("extract invalid component name"))?, + val.get(1) + .ok_or(aerr!("index 1 not in extract value"))? + .as_str().ok_or(aerr!("extract member name not a string"))?.to_string() + )) + }) + .collect::<Result<Vec<(String, ComponentType, String)>>>()? + }; + assemblage.components.append(&mut Self::common_short_definitions(val)?); assemblage.validate()?; Ok(assemblage) } |
