From f290e7b5b2d08faf06da92c4cccb41500451bbaa Mon Sep 17 00:00:00 2001 From: Lucien Greathouse Date: Fri, 5 Apr 2019 15:17:58 -0700 Subject: [PATCH] Support implicit values in JSON models (#154) * Support implicit values in JSON models * Update Changelog --- CHANGELOG.md | 1 + server/src/rbx_snapshot.rs | 30 +++++--- server/tests/snapshot_snapshots.rs | 1 + test-projects/json_model/default.project.json | 6 ++ .../json_model/expected-snapshot.json | 76 +++++++++++++++++++ .../json_model/src/children.model.json | 10 +++ .../json_model/src/explicit.model.json | 11 +++ .../json_model/src/implicit.model.json | 7 ++ 8 files changed, 131 insertions(+), 11 deletions(-) create mode 100644 test-projects/json_model/default.project.json create mode 100644 test-projects/json_model/expected-snapshot.json create mode 100644 test-projects/json_model/src/children.model.json create mode 100644 test-projects/json_model/src/explicit.model.json create mode 100644 test-projects/json_model/src/implicit.model.json diff --git a/CHANGELOG.md b/CHANGELOG.md index da7de71d..fc397b09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Rojo Changelog ## [Unreleased] +* Added support for implicit property values in JSON model files ([#154](https://github.com/LPGhatguy/rojo/pull/154)) ## [0.5.0 Alpha 9](https://github.com/LPGhatguy/rojo/releases/tag/v0.5.0-alpha.9) (April 4, 2019) * Changed `rojo build` to use buffered I/O, which can make it up to 2x faster in some cases. diff --git a/server/src/rbx_snapshot.rs b/server/src/rbx_snapshot.rs index d5fb72ad..c31e98e1 100644 --- a/server/src/rbx_snapshot.rs +++ b/server/src/rbx_snapshot.rs @@ -13,7 +13,7 @@ use rlua::Lua; use failure::Fail; use log::info; use maplit::hashmap; -use rbx_dom_weak::{RbxTree, RbxValue, RbxInstanceProperties}; +use rbx_dom_weak::{RbxTree, RbxValue, RbxInstanceProperties, UnresolvedRbxValue}; use serde_derive::{Serialize, Deserialize}; use rbx_reflection::{try_resolve_value, ValueResolveError}; @@ -602,7 +602,7 @@ fn snapshot_json_model_file<'source>( path: file.path.to_owned(), })?; - let mut snapshot = json_instance.into_snapshot(); + let mut snapshot = json_instance.into_snapshot()?; snapshot.metadata.source_path = Some(file.path.to_owned()); Ok(Some(snapshot)) @@ -618,23 +618,31 @@ struct JsonModelInstance { children: Vec, #[serde(default = "HashMap::new", skip_serializing_if = "HashMap::is_empty")] - properties: HashMap, + properties: HashMap, } impl JsonModelInstance { - fn into_snapshot(mut self) -> RbxSnapshotInstance<'static> { - let children = self.children - .drain(..) - .map(JsonModelInstance::into_snapshot) - .collect(); + fn into_snapshot(self) -> Result, SnapshotError> { + let mut children = Vec::with_capacity(self.children.len()); - RbxSnapshotInstance { + for child in self.children { + children.push(child.into_snapshot()?); + } + + let mut properties = HashMap::with_capacity(self.properties.len()); + + for (key, value) in self.properties { + let resolved_value = try_resolve_value(&self.class_name, &key, &value)?; + properties.insert(key, resolved_value); + } + + Ok(RbxSnapshotInstance { name: Cow::Owned(self.name), class_name: Cow::Owned(self.class_name), - properties: self.properties, + properties, children, metadata: Default::default(), - } + }) } } diff --git a/server/tests/snapshot_snapshots.rs b/server/tests/snapshot_snapshots.rs index 1efeffa6..7c3d1e78 100644 --- a/server/tests/snapshot_snapshots.rs +++ b/server/tests/snapshot_snapshots.rs @@ -33,6 +33,7 @@ macro_rules! generate_snapshot_tests { generate_snapshot_tests!( empty, + json_model, localization, multi_partition_game, nested_partitions, diff --git a/test-projects/json_model/default.project.json b/test-projects/json_model/default.project.json new file mode 100644 index 00000000..603a4ca8 --- /dev/null +++ b/test-projects/json_model/default.project.json @@ -0,0 +1,6 @@ +{ + "name": "json_model", + "tree": { + "$path": "src" + } +} \ No newline at end of file diff --git a/test-projects/json_model/expected-snapshot.json b/test-projects/json_model/expected-snapshot.json new file mode 100644 index 00000000..e4f223d8 --- /dev/null +++ b/test-projects/json_model/expected-snapshot.json @@ -0,0 +1,76 @@ +{ + "name": "json_model", + "class_name": "Folder", + "properties": {}, + "children": [ + { + "name": "children", + "class_name": "Folder", + "properties": {}, + "children": [ + { + "name": "The Child", + "class_name": "StringValue", + "properties": {}, + "children": [], + "metadata": { + "ignore_unknown_instances": false, + "source_path": null, + "project_definition": null + } + } + ], + "metadata": { + "ignore_unknown_instances": false, + "source_path": "src/children.model.json", + "project_definition": null + } + }, + { + "name": "explicit", + "class_name": "StringValue", + "properties": { + "Value": { + "Type": "String", + "Value": "Hello, world!" + } + }, + "children": [], + "metadata": { + "ignore_unknown_instances": false, + "source_path": "src/explicit.model.json", + "project_definition": null + } + }, + { + "name": "implicit", + "class_name": "StringValue", + "properties": { + "Value": { + "Type": "String", + "Value": "What's happenin', Earth?" + } + }, + "children": [], + "metadata": { + "ignore_unknown_instances": false, + "source_path": "src/implicit.model.json", + "project_definition": null + } + } + ], + "metadata": { + "ignore_unknown_instances": false, + "source_path": "src", + "project_definition": [ + "json_model", + { + "class_name": null, + "children": {}, + "properties": {}, + "ignore_unknown_instances": null, + "path": "src" + } + ] + } +} \ No newline at end of file diff --git a/test-projects/json_model/src/children.model.json b/test-projects/json_model/src/children.model.json new file mode 100644 index 00000000..d5a9ea91 --- /dev/null +++ b/test-projects/json_model/src/children.model.json @@ -0,0 +1,10 @@ +{ + "Name": "children", + "ClassName": "Folder", + "Children": [ + { + "Name": "The Child", + "ClassName": "StringValue" + } + ] +} \ No newline at end of file diff --git a/test-projects/json_model/src/explicit.model.json b/test-projects/json_model/src/explicit.model.json new file mode 100644 index 00000000..99d0b11a --- /dev/null +++ b/test-projects/json_model/src/explicit.model.json @@ -0,0 +1,11 @@ +{ + "Name": "explicit", + "ClassName": "StringValue", + "Properties": { + "Value": { + "Type": "String", + "Value": "Hello, world!" + } + }, + "Children": [] +} \ No newline at end of file diff --git a/test-projects/json_model/src/implicit.model.json b/test-projects/json_model/src/implicit.model.json new file mode 100644 index 00000000..91a2c778 --- /dev/null +++ b/test-projects/json_model/src/implicit.model.json @@ -0,0 +1,7 @@ +{ + "Name": "implicit", + "ClassName": "StringValue", + "Properties": { + "Value": "What's happenin', Earth?" + } +} \ No newline at end of file