diff --git a/src/snapshot_middleware/mod.rs b/src/snapshot_middleware/mod.rs index 9b2c4980..21f5b838 100644 --- a/src/snapshot_middleware/mod.rs +++ b/src/snapshot_middleware/mod.rs @@ -11,6 +11,7 @@ mod json_model; mod lua; mod middleware; mod project; +mod rbxlx; mod rbxm; mod rbxmx; mod txt; @@ -24,6 +25,7 @@ use self::{ lua::SnapshotLua, middleware::{SnapshotFileResult, SnapshotInstanceResult, SnapshotMiddleware}, project::SnapshotProject, + rbxlx::SnapshotRbxlx, rbxm::SnapshotRbxm, rbxmx::SnapshotRbxmx, txt::SnapshotTxt, @@ -67,6 +69,7 @@ macro_rules! middlewares { middlewares! { SnapshotProject, SnapshotJsonModel, + SnapshotRbxlx, SnapshotRbxmx, SnapshotRbxm, SnapshotLua, diff --git a/src/snapshot_middleware/rbxlx.rs b/src/snapshot_middleware/rbxlx.rs new file mode 100644 index 00000000..66282fc8 --- /dev/null +++ b/src/snapshot_middleware/rbxlx.rs @@ -0,0 +1,54 @@ +use std::borrow::Cow; + +use rbx_dom_weak::{RbxId, RbxTree}; + +use crate::{ + imfs::{Imfs, ImfsEntry, ImfsFetcher}, + snapshot::InstanceSnapshot, +}; + +use super::middleware::{SnapshotFileResult, SnapshotInstanceResult, SnapshotMiddleware}; + +pub struct SnapshotRbxlx; + +impl SnapshotMiddleware for SnapshotRbxlx { + fn from_imfs( + imfs: &mut Imfs, + entry: &ImfsEntry, + ) -> SnapshotInstanceResult<'static> { + if entry.is_directory() { + return Ok(None); + } + + let file_name = entry.path().file_name().unwrap().to_string_lossy(); + + if !file_name.ends_with(".rbxlx") { + return Ok(None); + } + + let instance_name = entry + .path() + .file_stem() + .expect("Could not extract file stem") + .to_string_lossy() + .to_string(); + + let options = rbx_xml::DecodeOptions::new() + .property_behavior(rbx_xml::DecodePropertyBehavior::ReadUnknown); + + let temp_tree = rbx_xml::from_reader(entry.contents(imfs)?, options) + .expect("TODO: Handle rbx_xml errors"); + + let root_id = temp_tree.get_root_id(); + + let mut snapshot = InstanceSnapshot::from_tree(&temp_tree, root_id); + snapshot.name = Cow::Owned(instance_name); + // TODO: Assign snapshot.source + + Ok(Some(snapshot)) + } + + fn from_instance(_tree: &RbxTree, _id: RbxId) -> SnapshotFileResult { + None + } +}