diff --git a/src/plugin.rs b/src/plugin.rs index 2a6e34a6..5b80f084 100644 --- a/src/plugin.rs +++ b/src/plugin.rs @@ -2,6 +2,7 @@ use rbx::RbxItem; use vfs::VfsItem; use core::Route; +// TODO: Add error case? pub enum TransformFileResult { Value(Option), Pass, diff --git a/src/plugins/default_plugin.rs b/src/plugins/default_plugin.rs index b9503877..a503fbe8 100644 --- a/src/plugins/default_plugin.rs +++ b/src/plugins/default_plugin.rs @@ -59,7 +59,7 @@ impl Plugin for DefaultPlugin { FileChangeResult::MarkChanged(Some(vec![route.clone()])) } - fn handle_rbx_change(&self, route: &Route, rbx_item: &RbxItem) -> RbxChangeResult { + fn handle_rbx_change(&self, _route: &Route, _rbx_item: &RbxItem) -> RbxChangeResult { RbxChangeResult::Pass } } diff --git a/src/plugins/json_model_plugin.rs b/src/plugins/json_model_plugin.rs new file mode 100644 index 00000000..137560c8 --- /dev/null +++ b/src/plugins/json_model_plugin.rs @@ -0,0 +1,52 @@ +use regex::Regex; +use serde_json; + +use core::Route; +use plugin::{Plugin, PluginChain, TransformFileResult, RbxChangeResult, FileChangeResult}; +use rbx::{RbxItem, RbxValue}; +use vfs::VfsItem; + +lazy_static! { + static ref JSON_MODEL_PATTERN: Regex = Regex::new(r"^(.*?)\.model\.json$").unwrap(); +} + +pub struct JsonModelPlugin; + +impl JsonModelPlugin { + pub fn new() -> JsonModelPlugin { + JsonModelPlugin + } +} + +impl Plugin for JsonModelPlugin { + fn transform_file(&self, _plugins: &PluginChain, vfs_item: &VfsItem) -> TransformFileResult { + match vfs_item { + &VfsItem::File { ref contents, ref name } => { + let rbx_name = match JSON_MODEL_PATTERN.captures(name) { + Some(captures) => captures.get(1).unwrap().as_str().to_string(), + None => return TransformFileResult::Pass, + }; + + let mut rbx_item: RbxItem = match serde_json::from_str(contents) { + Ok(v) => v, + Err(_) => return TransformFileResult::Pass, // This should be an error in the future + }; + + rbx_item.properties.insert("Name".to_string(), RbxValue::String { + value: rbx_name, + }); + + TransformFileResult::Value(Some(rbx_item)) + }, + &VfsItem::Dir { .. } => TransformFileResult::Pass, + } + } + + fn handle_file_change(&self, _route: &Route) -> FileChangeResult { + FileChangeResult::Pass + } + + fn handle_rbx_change(&self, _route: &Route, _rbx_item: &RbxItem) -> RbxChangeResult { + RbxChangeResult::Pass + } +} diff --git a/src/plugins/mod.rs b/src/plugins/mod.rs index dd39b2db..73482635 100644 --- a/src/plugins/mod.rs +++ b/src/plugins/mod.rs @@ -1,5 +1,7 @@ mod default_plugin; mod script_plugin; +mod json_model_plugin; pub use self::default_plugin::*; pub use self::script_plugin::*; +pub use self::json_model_plugin::*; diff --git a/src/plugins/script_plugin.rs b/src/plugins/script_plugin.rs index 70cdc059..38bd746a 100644 --- a/src/plugins/script_plugin.rs +++ b/src/plugins/script_plugin.rs @@ -115,7 +115,7 @@ impl Plugin for ScriptPlugin { } } - fn handle_rbx_change(&self, route: &Route, rbx_item: &RbxItem) -> RbxChangeResult { + fn handle_rbx_change(&self, _route: &Route, _rbx_item: &RbxItem) -> RbxChangeResult { RbxChangeResult::Pass } }