diff --git a/server/src/rbx.rs b/server/src/rbx.rs index 49822ea7..957f40cb 100644 --- a/server/src/rbx.rs +++ b/server/src/rbx.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::collections::HashMap; use id::Id; @@ -23,6 +24,12 @@ pub struct RbxInstance { pub parent: Option, } +impl<'a> From<&'a RbxInstance> for Cow<'a, RbxInstance> { + fn from(instance: &'a RbxInstance) -> Cow<'a, RbxInstance> { + Cow::Borrowed(instance) + } +} + pub struct RbxTree { instances: HashMap, } @@ -81,7 +88,9 @@ impl RbxTree { ids_deleted } - pub fn get_instance<'a, 'b>(&'a self, id: Id, output: &'b mut HashMap) { + pub fn get_instance<'a, 'b, T>(&'a self, id: Id, output: &'b mut HashMap) + where T: From<&'a RbxInstance> + { let mut ids_to_visit = vec![id]; loop { @@ -92,7 +101,7 @@ impl RbxTree { match self.instances.get(&id) { Some(instance) => { - output.insert(id, instance); + output.insert(id, instance.into()); for child_id in &instance.children { ids_to_visit.push(*child_id); diff --git a/server/src/web.rs b/server/src/web.rs index 66aa5efa..d2c1de0e 100644 --- a/server/src/web.rs +++ b/server/src/web.rs @@ -49,12 +49,12 @@ pub struct ReadAllResponse<'a> { pub instances: Cow<'a, HashMap>, } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ReadResponse<'a> { pub server_id: &'a str, pub message_cursor: i32, - pub instances: HashMap, + pub instances: HashMap>, } #[derive(Debug, Serialize)] diff --git a/server/tests/web.rs b/server/tests/web.rs index 7d771c4b..c3585307 100644 --- a/server/tests/web.rs +++ b/server/tests/web.rs @@ -13,7 +13,7 @@ use std::path::PathBuf; use librojo::{ session::Session, project::Project, - web::{Server, WebConfig, ServerInfoResponse, ReadAllResponse}, + web::{Server, WebConfig, ServerInfoResponse, ReadResponse, ReadAllResponse}, }; #[test] @@ -48,4 +48,13 @@ fn empty() { assert_eq!(response.message_cursor, -1); assert_eq!(response.instances.as_ref(), &HashMap::new()); } + + { + let body = server.get_string("/api/read/0"); + let response = serde_json::from_str::(&body).unwrap(); + + assert_eq!(response.server_id, "0"); + assert_eq!(response.message_cursor, -1); + assert_eq!(response.instances, HashMap::new()); + } } \ No newline at end of file