Add SnapshotSource property

This commit is contained in:
Lucien Greathouse
2019-09-05 11:27:16 -07:00
parent 439a1a758e
commit a914a92cea
11 changed files with 39 additions and 3 deletions

View File

@@ -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,
},
}

View File

@@ -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! {

View File

@@ -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),

View File

@@ -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! {

View File

@@ -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(),

View File

@@ -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(),

View File

@@ -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,

View File

@@ -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,

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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,