init.meta.json support (#183)

* A minimum viable product for init.meta.json

* Properties support

* Add ignoreUnknownChildren support

* Apply requested changes

* Use reflection guiding

* Add a script to the test

* Change to ignoreUnknownInstances

* Apply requested changes
This commit is contained in:
boyned//Kampfkarren
2019-06-06 16:58:58 -07:00
committed by Lucien Greathouse
parent 983d44947e
commit 0ed6c57c7f
8 changed files with 121 additions and 0 deletions

View File

@@ -39,6 +39,7 @@ use crate::{
const INIT_MODULE_NAME: &str = "init.lua";
const INIT_SERVER_NAME: &str = "init.server.lua";
const INIT_CLIENT_NAME: &str = "init.client.lua";
const INIT_META_NAME: &str = "init.meta.json";
pub struct SnapshotContext {
pub plugin_context: Option<SnapshotPluginContext>,
@@ -105,6 +106,12 @@ pub enum SnapshotError {
path: PathBuf,
},
InitMetaError {
#[fail(cause)]
inner: serde_json::Error,
path: PathBuf,
},
XmlModelDecodeError {
#[fail(cause)]
inner: rbx_xml::DecodeError,
@@ -152,6 +159,9 @@ impl fmt::Display for SnapshotError {
SnapshotError::JsonModelDecodeError { inner, path } => {
write!(output, "Malformed .model.json model: {} in path {}", inner, path.display())
},
SnapshotError::InitMetaError { inner, path } => {
write!(output, "Malformed init.meta.json: {} in path {}", inner, path.display())
},
SnapshotError::XmlModelDecodeError { inner, path } => {
write!(output, "Malformed rbxmx model: {} in path {}", inner, path.display())
},
@@ -299,6 +309,7 @@ fn snapshot_imfs_directory<'source>(
let init_path = directory.path.join(INIT_MODULE_NAME);
let init_server_path = directory.path.join(INIT_SERVER_NAME);
let init_client_path = directory.path.join(INIT_CLIENT_NAME);
let init_meta_path = directory.path.join(INIT_META_NAME);
let snapshot_name = instance_name
.unwrap_or_else(|| {
@@ -327,6 +338,27 @@ fn snapshot_imfs_directory<'source>(
}
};
if let Some(ImfsItem::File(file)) = imfs.get(&init_meta_path) {
let meta: InitMeta = serde_json::from_slice(&file.contents)
.map_err(|inner| SnapshotError::InitMetaError {
inner,
path: file.path.to_path_buf(),
})?;
if let Some(meta_class) = meta.class_name {
snapshot.class_name = Cow::Owned(meta_class);
}
if let Some(meta_ignore_instances) = meta.ignore_unknown_instances {
snapshot.metadata.ignore_unknown_instances = meta_ignore_instances;
}
for (key, value) in meta.properties {
let resolved_value = try_resolve_value(&snapshot.class_name, &key, &value)?;
snapshot.properties.insert(key, resolved_value);
}
}
snapshot.metadata.source_path = Some(directory.path.to_owned());
for child_path in &directory.children {
@@ -351,6 +383,16 @@ fn snapshot_imfs_directory<'source>(
Ok(Some(snapshot))
}
#[derive(Debug, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
struct InitMeta {
class_name: Option<String>,
ignore_unknown_instances: Option<bool>,
#[serde(default = "HashMap::new")]
properties: HashMap<String, UnresolvedRbxValue>,
}
fn snapshot_imfs_file<'source>(
context: &SnapshotContext,
file: &'source ImfsFile,

View File

@@ -35,6 +35,7 @@ generate_snapshot_tests!(
empty,
json_model,
localization,
meta_files,
multi_partition_game,
nested_partitions,
single_partition_game,

View File

@@ -0,0 +1,6 @@
{
"name": "test-model",
"tree": {
"$path": "src"
}
}

View File

@@ -0,0 +1,57 @@
{
"name": "test-model",
"class_name": "Tool",
"properties": {
"Enabled": {
"Type": "Bool",
"Value": true
}
},
"children": [
{
"name": "A",
"class_name": "Folder",
"properties": {},
"children": [],
"metadata": {
"ignore_unknown_instances": true,
"source_path": "src/A",
"project_definition": null
}
},
{
"name": "Script",
"class_name": "Script",
"properties": {
"Disabled": {
"Type": "Bool",
"Value": true
},
"Source": {
"Type": "String",
"Value": "print(\"Hello, world\")"
}
},
"children": [],
"metadata": {
"ignore_unknown_instances": false,
"source_path": "src/Script",
"project_definition": null
}
}
],
"metadata": {
"ignore_unknown_instances": false,
"source_path": "src",
"project_definition": [
"test-model",
{
"class_name": null,
"children": {},
"properties": {},
"ignore_unknown_instances": null,
"path": "src"
}
]
}
}

View File

@@ -0,0 +1,3 @@
{
"ignoreUnknownInstances": true
}

View File

@@ -0,0 +1,5 @@
{
"properties": {
"Disabled": true
}
}

View File

@@ -0,0 +1 @@
print("Hello, world")

View File

@@ -0,0 +1,6 @@
{
"className": "Tool",
"properties": {
"Enabled": true
}
}