forked from rojo-rbx/rojo
Add SnapshotSource property
This commit is contained in:
@@ -1,25 +1,32 @@
|
|||||||
//! Defines the structure of an instance snapshot.
|
//! Defines the structure of an instance snapshot.
|
||||||
|
|
||||||
use std::{borrow::Cow, collections::HashMap};
|
use std::{borrow::Cow, collections::HashMap, path::PathBuf};
|
||||||
|
|
||||||
use rbx_dom_weak::{RbxId, RbxTree, RbxValue};
|
use rbx_dom_weak::{RbxId, RbxTree, RbxValue};
|
||||||
|
|
||||||
|
use crate::project::ProjectNode;
|
||||||
|
|
||||||
/// A lightweight description of what an instance should look like. Attempts to
|
/// A lightweight description of what an instance should look like. Attempts to
|
||||||
/// be somewhat memory efficient by borrowing from its source data, indicated by
|
/// be somewhat memory efficient by borrowing from its source data, indicated by
|
||||||
/// the lifetime parameter, `'source`.
|
/// the lifetime parameter `'source`.
|
||||||
///
|
///
|
||||||
// Possible future improvements:
|
// Possible future improvements:
|
||||||
// - Use refcounted/interned strings
|
// - Use refcounted/interned strings
|
||||||
// - Replace use of RbxValue with a sum of RbxValue + borrowed value
|
// - Replace use of RbxValue with a sum of RbxValue + borrowed value
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub struct InstanceSnapshot<'source> {
|
pub struct InstanceSnapshot<'source> {
|
||||||
|
/// A temporary ID applied to the snapshot that's used for Ref properties.
|
||||||
pub snapshot_id: Option<RbxId>,
|
pub snapshot_id: Option<RbxId>,
|
||||||
|
|
||||||
|
/// A complete view of where this snapshot came from. It should contain
|
||||||
|
/// enough information, if not None, to recreate this snapshot
|
||||||
|
/// deterministically assuming the source has not changed state.
|
||||||
|
pub source: Option<SnapshotSource>,
|
||||||
|
|
||||||
pub name: Cow<'source, str>,
|
pub name: Cow<'source, str>,
|
||||||
pub class_name: Cow<'source, str>,
|
pub class_name: Cow<'source, str>,
|
||||||
pub properties: HashMap<String, RbxValue>,
|
pub properties: HashMap<String, RbxValue>,
|
||||||
pub children: Vec<InstanceSnapshot<'source>>,
|
pub children: Vec<InstanceSnapshot<'source>>,
|
||||||
// TODO: Snapshot source, like a file or a project node?
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'source> InstanceSnapshot<'source> {
|
impl<'source> InstanceSnapshot<'source> {
|
||||||
@@ -32,6 +39,7 @@ impl<'source> InstanceSnapshot<'source> {
|
|||||||
|
|
||||||
InstanceSnapshot {
|
InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: self.source.clone(),
|
||||||
name: Cow::Owned(self.name.clone().into_owned()),
|
name: Cow::Owned(self.name.clone().into_owned()),
|
||||||
class_name: Cow::Owned(self.class_name.clone().into_owned()),
|
class_name: Cow::Owned(self.class_name.clone().into_owned()),
|
||||||
properties: self.properties.clone(),
|
properties: self.properties.clone(),
|
||||||
@@ -53,6 +61,7 @@ impl<'source> InstanceSnapshot<'source> {
|
|||||||
|
|
||||||
InstanceSnapshot {
|
InstanceSnapshot {
|
||||||
snapshot_id: Some(id),
|
snapshot_id: Some(id),
|
||||||
|
source: None,
|
||||||
name: Cow::Owned(instance.name.clone()),
|
name: Cow::Owned(instance.name.clone()),
|
||||||
class_name: Cow::Owned(instance.class_name.clone()),
|
class_name: Cow::Owned(instance.class_name.clone()),
|
||||||
properties: instance.properties.clone(),
|
properties: instance.properties.clone(),
|
||||||
@@ -60,3 +69,15 @@ impl<'source> InstanceSnapshot<'source> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
|
pub enum SnapshotSource {
|
||||||
|
File {
|
||||||
|
path: PathBuf,
|
||||||
|
},
|
||||||
|
ProjectFile {
|
||||||
|
path: PathBuf,
|
||||||
|
name: String,
|
||||||
|
node: ProjectNode,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|||||||
@@ -159,6 +159,7 @@ mod test {
|
|||||||
|
|
||||||
let snapshot = InstanceSnapshot {
|
let snapshot = InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: None,
|
||||||
name: Cow::Borrowed("Foo"),
|
name: Cow::Borrowed("Foo"),
|
||||||
class_name: Cow::Borrowed("Bar"),
|
class_name: Cow::Borrowed("Bar"),
|
||||||
properties: hashmap! {
|
properties: hashmap! {
|
||||||
|
|||||||
@@ -244,6 +244,7 @@ mod test {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
source: None,
|
||||||
name: Cow::Borrowed("foo"),
|
name: Cow::Borrowed("foo"),
|
||||||
class_name: Cow::Borrowed("foo"),
|
class_name: Cow::Borrowed("foo"),
|
||||||
children: Vec::new(),
|
children: Vec::new(),
|
||||||
@@ -294,11 +295,13 @@ mod test {
|
|||||||
},
|
},
|
||||||
|
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: None,
|
||||||
name: Cow::Borrowed("child"),
|
name: Cow::Borrowed("child"),
|
||||||
class_name: Cow::Borrowed("child"),
|
class_name: Cow::Borrowed("child"),
|
||||||
children: Vec::new(),
|
children: Vec::new(),
|
||||||
}],
|
}],
|
||||||
|
|
||||||
|
source: None,
|
||||||
properties: HashMap::new(),
|
properties: HashMap::new(),
|
||||||
name: Cow::Borrowed("foo"),
|
name: Cow::Borrowed("foo"),
|
||||||
class_name: Cow::Borrowed("foo"),
|
class_name: Cow::Borrowed("foo"),
|
||||||
@@ -311,6 +314,7 @@ mod test {
|
|||||||
parent_id: root_id,
|
parent_id: root_id,
|
||||||
instance: InstanceSnapshot {
|
instance: InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: None,
|
||||||
properties: hashmap! {
|
properties: hashmap! {
|
||||||
"Self".to_owned() => RbxValue::Ref {
|
"Self".to_owned() => RbxValue::Ref {
|
||||||
value: Some(root_id),
|
value: Some(root_id),
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ impl SnapshotMiddleware for SnapshotCsv {
|
|||||||
|
|
||||||
Ok(Some(InstanceSnapshot {
|
Ok(Some(InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: None, // TODO
|
||||||
name: Cow::Owned(instance_name),
|
name: Cow::Owned(instance_name),
|
||||||
class_name: Cow::Borrowed("LocalizationTable"),
|
class_name: Cow::Borrowed("LocalizationTable"),
|
||||||
properties: hashmap! {
|
properties: hashmap! {
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ impl SnapshotMiddleware for SnapshotDir {
|
|||||||
|
|
||||||
Ok(Some(InstanceSnapshot {
|
Ok(Some(InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: None, // TODO
|
||||||
name: Cow::Owned(instance_name),
|
name: Cow::Owned(instance_name),
|
||||||
class_name: Cow::Borrowed("Folder"),
|
class_name: Cow::Borrowed("Folder"),
|
||||||
properties: HashMap::new(),
|
properties: HashMap::new(),
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ impl JsonModelCore {
|
|||||||
|
|
||||||
InstanceSnapshot {
|
InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: None, // TODO
|
||||||
name: Cow::Owned(name),
|
name: Cow::Owned(name),
|
||||||
class_name: Cow::Owned(class_name),
|
class_name: Cow::Owned(class_name),
|
||||||
properties,
|
properties,
|
||||||
@@ -169,6 +170,7 @@ mod test {
|
|||||||
instance_snapshot,
|
instance_snapshot,
|
||||||
InstanceSnapshot {
|
InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: None, // TODO
|
||||||
name: Cow::Borrowed("foo"),
|
name: Cow::Borrowed("foo"),
|
||||||
class_name: Cow::Borrowed("IntValue"),
|
class_name: Cow::Borrowed("IntValue"),
|
||||||
properties: hashmap! {
|
properties: hashmap! {
|
||||||
@@ -178,6 +180,7 @@ mod test {
|
|||||||
},
|
},
|
||||||
children: vec![InstanceSnapshot {
|
children: vec![InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: None, // TODO
|
||||||
name: Cow::Borrowed("The Child"),
|
name: Cow::Borrowed("The Child"),
|
||||||
class_name: Cow::Borrowed("StringValue"),
|
class_name: Cow::Borrowed("StringValue"),
|
||||||
properties: HashMap::new(),
|
properties: HashMap::new(),
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ fn snapshot_lua_file<F: ImfsFetcher>(
|
|||||||
|
|
||||||
Ok(Some(InstanceSnapshot {
|
Ok(Some(InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: None, // TODO
|
||||||
name: Cow::Owned(instance_name.to_owned()),
|
name: Cow::Owned(instance_name.to_owned()),
|
||||||
class_name: Cow::Borrowed(class_name),
|
class_name: Cow::Borrowed(class_name),
|
||||||
properties,
|
properties,
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ fn snapshot_project_node<F: ImfsFetcher>(
|
|||||||
|
|
||||||
Ok(Some(InstanceSnapshot {
|
Ok(Some(InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: None, // TODO
|
||||||
name,
|
name,
|
||||||
class_name,
|
class_name,
|
||||||
properties,
|
properties,
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ impl SnapshotMiddleware for SnapshotRbxm {
|
|||||||
if children.len() == 1 {
|
if children.len() == 1 {
|
||||||
let mut snapshot = InstanceSnapshot::from_tree(&temp_tree, children[0]);
|
let mut snapshot = InstanceSnapshot::from_tree(&temp_tree, children[0]);
|
||||||
snapshot.name = Cow::Owned(instance_name);
|
snapshot.name = Cow::Owned(instance_name);
|
||||||
|
// TODO: Assign snapshot.source
|
||||||
|
|
||||||
Ok(Some(snapshot))
|
Ok(Some(snapshot))
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ impl SnapshotMiddleware for SnapshotRbxmx {
|
|||||||
if children.len() == 1 {
|
if children.len() == 1 {
|
||||||
let mut snapshot = InstanceSnapshot::from_tree(&temp_tree, children[0]);
|
let mut snapshot = InstanceSnapshot::from_tree(&temp_tree, children[0]);
|
||||||
snapshot.name = Cow::Owned(instance_name);
|
snapshot.name = Cow::Owned(instance_name);
|
||||||
|
// TODO: Assign snapshot.source
|
||||||
|
|
||||||
Ok(Some(snapshot))
|
Ok(Some(snapshot))
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ impl SnapshotMiddleware for SnapshotTxt {
|
|||||||
|
|
||||||
Ok(Some(InstanceSnapshot {
|
Ok(Some(InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
|
source: None, // TODO
|
||||||
name: Cow::Owned(instance_name),
|
name: Cow::Owned(instance_name),
|
||||||
class_name: Cow::Borrowed("StringValue"),
|
class_name: Cow::Borrowed("StringValue"),
|
||||||
properties,
|
properties,
|
||||||
|
|||||||
Reference in New Issue
Block a user