From bfd33f4b8d9505a3a6de6243bdc7e6e14524bcb6 Mon Sep 17 00:00:00 2001 From: Lucien Greathouse Date: Fri, 1 Jun 2018 23:29:39 -0700 Subject: [PATCH] Support init.model.json Closes #66. --- server/src/plugins/json_model_plugin.rs | 37 ++++++++++++++++++- test-project/src/SomeTool/SomeTool.client.lua | 1 + test-project/src/SomeTool/init.model.json | 4 ++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 test-project/src/SomeTool/SomeTool.client.lua create mode 100644 test-project/src/SomeTool/init.model.json diff --git a/server/src/plugins/json_model_plugin.rs b/server/src/plugins/json_model_plugin.rs index 2deee6ea..9a40b0c3 100644 --- a/server/src/plugins/json_model_plugin.rs +++ b/server/src/plugins/json_model_plugin.rs @@ -10,6 +10,8 @@ lazy_static! { static ref JSON_MODEL_PATTERN: Regex = Regex::new(r"^(.*?)\.model\.json$").unwrap(); } +static JSON_MODEL_INIT: &'static str = "init.model.json"; + pub struct JsonModelPlugin; impl JsonModelPlugin { @@ -19,7 +21,7 @@ impl JsonModelPlugin { } impl Plugin for JsonModelPlugin { - fn transform_file(&self, _plugins: &PluginChain, vfs_item: &VfsItem) -> TransformFileResult { + fn transform_file(&self, plugins: &PluginChain, vfs_item: &VfsItem) -> TransformFileResult { match vfs_item { &VfsItem::File { ref contents, .. } => { let rbx_name = match JSON_MODEL_PATTERN.captures(vfs_item.name()) { @@ -41,7 +43,38 @@ impl Plugin for JsonModelPlugin { TransformFileResult::Value(Some(rbx_item)) }, - &VfsItem::Dir { .. } => TransformFileResult::Pass, + &VfsItem::Dir { ref children, .. } => { + let init_item = match children.get(JSON_MODEL_INIT) { + Some(v) => v, + None => return TransformFileResult::Pass, + }; + + let mut rbx_item = match self.transform_file(plugins, init_item) { + TransformFileResult::Value(Some(item)) => item, + TransformFileResult::Value(None) | TransformFileResult::Pass => { + eprintln!("Inconsistency detected in JsonModelPlugin!"); + return TransformFileResult::Pass; + }, + }; + + rbx_item.name.clear(); + rbx_item.name.push_str(vfs_item.name()); + + for (child_name, child_item) in children { + if child_name == init_item.name() { + continue; + } + + match plugins.transform_file(child_item) { + Some(child_rbx_item) => { + rbx_item.children.push(child_rbx_item); + }, + _ => {}, + } + } + + TransformFileResult::Value(Some(rbx_item)) + }, } } diff --git a/test-project/src/SomeTool/SomeTool.client.lua b/test-project/src/SomeTool/SomeTool.client.lua new file mode 100644 index 00000000..9c537fc8 --- /dev/null +++ b/test-project/src/SomeTool/SomeTool.client.lua @@ -0,0 +1 @@ +print("Hello, world, from my tool!") \ No newline at end of file diff --git a/test-project/src/SomeTool/init.model.json b/test-project/src/SomeTool/init.model.json new file mode 100644 index 00000000..500c7bca --- /dev/null +++ b/test-project/src/SomeTool/init.model.json @@ -0,0 +1,4 @@ +{ + "Name": "SomeTool", + "ClassName": "Tool" +} \ No newline at end of file