summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-02 15:10:53 +0200
committertroido <troido@protonmail.com>2020-04-02 15:10:53 +0200
commit1e8fe74740fc4fb11b660415b2db182c6a63a3c2 (patch)
treedf077b33f0aa5da69d3377672589838dee604356 /src
parent4f9932074a8f0390d5cb6072b4e419c7ab08ffed (diff)
short value for flags; radish plants now have occupied flag
Diffstat (limited to 'src')
-rw-r--r--src/assemblage.rs76
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)
}