mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-10-23 14:01:37 +00:00
Switch from 'parent' property to 'children' property for tracking instances
This commit is contained in:
parent
313e617181
commit
1137584cd3
3 changed files with 26 additions and 42 deletions
|
|
@ -14,11 +14,9 @@ pub struct RbxInstance {
|
|||
/// Maps to the `ClassName` property on Instance.
|
||||
pub class_name: String,
|
||||
|
||||
/// Maps to the `Parent` property on Instance.
|
||||
pub parent: Option<Id>,
|
||||
|
||||
/// Contains all other properties of an Instance.
|
||||
pub properties: HashMap<String, RbxValue>,
|
||||
|
||||
// TODO: children property, Vec<Id>
|
||||
/// All of the children of this instance. Order is relevant to preserve!
|
||||
pub children: Vec<Id>,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,19 +32,11 @@ fn file_to_instances(
|
|||
},
|
||||
};
|
||||
|
||||
let parent = match file_item.get_route().parent() {
|
||||
Some(parent_route) => match instances_by_route.get(&parent_route) {
|
||||
Some(parent_id) => Some(*parent_id),
|
||||
None => None,
|
||||
},
|
||||
None => None,
|
||||
};
|
||||
|
||||
output.insert(primary_id, RbxInstance {
|
||||
name: route.name(partition).to_string(),
|
||||
class_name: "StringValue".to_string(),
|
||||
parent,
|
||||
properties,
|
||||
children: Vec::new(),
|
||||
});
|
||||
|
||||
(primary_id, vec![primary_id])
|
||||
|
|
@ -60,28 +52,14 @@ fn file_to_instances(
|
|||
},
|
||||
};
|
||||
|
||||
let parent = match file_item.get_route().parent() {
|
||||
Some(parent_route) => match instances_by_route.get(&parent_route) {
|
||||
Some(parent_id) => Some(*parent_id),
|
||||
None => None,
|
||||
},
|
||||
None => None,
|
||||
};
|
||||
|
||||
output.insert(primary_id, RbxInstance {
|
||||
name: route.name(partition).to_string(),
|
||||
class_name: "Folder".to_string(),
|
||||
parent,
|
||||
properties: HashMap::new(),
|
||||
});
|
||||
let mut child_ids = Vec::new();
|
||||
|
||||
let mut changed_ids = vec![primary_id];
|
||||
|
||||
for child_file_item in children.values() {
|
||||
let (child_id, mut child_changed_ids) = file_to_instances(child_file_item, partition, output, instances_by_route);
|
||||
|
||||
output.get_mut(&child_id).unwrap().parent = Some(primary_id);
|
||||
|
||||
child_ids.push(child_id);
|
||||
changed_ids.push(child_id);
|
||||
|
||||
// TODO: Should I stop using drain on Vecs of Copyable types?
|
||||
|
|
@ -90,6 +68,13 @@ fn file_to_instances(
|
|||
}
|
||||
}
|
||||
|
||||
output.insert(primary_id, RbxInstance {
|
||||
name: route.name(partition).to_string(),
|
||||
class_name: "Folder".to_string(),
|
||||
properties: HashMap::new(),
|
||||
children: child_ids,
|
||||
});
|
||||
|
||||
(primary_id, changed_ids)
|
||||
},
|
||||
}
|
||||
|
|
@ -125,6 +110,19 @@ impl RbxSession {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn retrieve_instance<'a, 'b>(&'a self, id: Id, output: &'b mut HashMap<Id, &'a RbxInstance>) {
|
||||
let requested_instance = match self.instances.get(&id) {
|
||||
Some(instance) => instance,
|
||||
None => return,
|
||||
};
|
||||
|
||||
output.insert(id, requested_instance);
|
||||
|
||||
for child_id in &requested_instance.children {
|
||||
self.retrieve_instance(*child_id, output);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn read_partitions(&mut self) {
|
||||
let vfs_session_arc = self.vfs_session.clone();
|
||||
let vfs_session = vfs_session_arc.read().unwrap();
|
||||
|
|
|
|||
|
|
@ -162,19 +162,7 @@ pub fn start(config: WebConfig) {
|
|||
let mut instances = HashMap::new();
|
||||
|
||||
for requested_id in &requested_ids {
|
||||
let requested_instance = match rbx_session.instances.get(requested_id) {
|
||||
Some(instance) => instance,
|
||||
None => continue,
|
||||
};
|
||||
|
||||
instances.insert(*requested_id, requested_instance);
|
||||
|
||||
// Oops; this needs to be recursive.
|
||||
for (child_id, instance) in &rbx_session.instances {
|
||||
if instance.parent == Some(*requested_id) {
|
||||
instances.insert(*child_id, instance);
|
||||
}
|
||||
}
|
||||
rbx_session.retrieve_instance(*requested_id, &mut instances);
|
||||
}
|
||||
|
||||
Response::json(&ReadResponse {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue