diff --git a/rojo-test/serve-test-snapshots/serve_test__empty.snap b/rojo-test/serve-test-snapshots/serve_test__empty.snap index e768d5fa..e65f8192 100644 --- a/rojo-test/serve-test-snapshots/serve_test__empty.snap +++ b/rojo-test/serve-test-snapshots/serve_test__empty.snap @@ -6,3 +6,4 @@ sessionId: "[session id]" serverVersion: 0.5.0 protocolVersion: 3 expectedPlaceIds: ~ +rootInstanceId: "[root id]" diff --git a/rojo-test/src/serve_test.rs b/rojo-test/src/serve_test.rs index 392d6f9f..e8f4cdeb 100644 --- a/rojo-test/src/serve_test.rs +++ b/rojo-test/src/serve_test.rs @@ -28,7 +28,8 @@ fn empty() { let info = session.wait_to_come_online(); assert_yaml_snapshot!(info, { - ".sessionId" => "[session id]" + ".sessionId" => "[session id]", + ".rootInstanceId" => "[root id]" }); }); } diff --git a/src/commands/serve.rs b/src/commands/serve.rs index 9d6c89d5..55f187da 100644 --- a/src/commands/serve.rs +++ b/src/commands/serve.rs @@ -70,7 +70,7 @@ pub fn serve(options: &ServeOptions) -> Result<(), ServeError> { let patch_set = compute_patch_set(&snapshot, &tree, root_id); apply_patch_set(&mut tree, &patch_set); - let session = Arc::new(ServeSession::new(maybe_project)); + let session = Arc::new(ServeSession::new(tree, maybe_project)); let server = LiveServer::new(session); server.start(port); diff --git a/src/imfs/error.rs b/src/imfs/error.rs index 07c7a8df..0369132e 100644 --- a/src/imfs/error.rs +++ b/src/imfs/error.rs @@ -19,19 +19,6 @@ impl FsResultExt for Result { } } -// TODO: New error type that contains errors specific to our application, -// wrapping io::Error either directly or through another error type that has -// path information. -// -// It's possible that we should hoist up the path information one more level, or -// destructure/restructure information to hoist the path out of FsError and just -// embed io::Error? -pub enum ImfsError { - NotFound, - WrongKind, - Io(io::Error), -} - /// A wrapper around io::Error that also attaches the path associated with the /// error. #[derive(Debug, Fail)] diff --git a/src/project.rs b/src/project.rs index 1b736a63..1869fe31 100644 --- a/src/project.rs +++ b/src/project.rs @@ -34,7 +34,7 @@ struct SourceProject { impl SourceProject { /// Consumes the SourceProject and yields a Project, ready for prime-time. - pub fn into_project(mut self, project_file_location: &Path) -> Project { + pub fn into_project(self, project_file_location: &Path) -> Project { let tree = self.tree.into_project_node(project_file_location); Project { diff --git a/src/serve_session.rs b/src/serve_session.rs index 2eb40af8..1396b1de 100644 --- a/src/serve_session.rs +++ b/src/serve_session.rs @@ -1,23 +1,29 @@ use std::collections::HashSet; -use crate::{project::Project, session_id::SessionId}; +use crate::{project::Project, session_id::SessionId, snapshot::RojoTree}; /// Contains all of the state for a Rojo serve session. pub struct ServeSession { root_project: Option, session_id: SessionId, + tree: RojoTree, } impl ServeSession { - pub fn new(root_project: Option) -> ServeSession { + pub fn new(tree: RojoTree, root_project: Option) -> ServeSession { let session_id = SessionId::new(); ServeSession { session_id, root_project, + tree, } } + pub fn tree(&self) -> &RojoTree { + &self.tree + } + pub fn session_id(&self) -> SessionId { self.session_id } diff --git a/src/snapshot_middleware/lua.rs b/src/snapshot_middleware/lua.rs index 91b5d77d..1b71416d 100644 --- a/src/snapshot_middleware/lua.rs +++ b/src/snapshot_middleware/lua.rs @@ -111,10 +111,12 @@ fn snapshot_init( let init_path = folder_entry.path().join(init_name); if let Some(init_entry) = imfs.get(init_path).with_not_found()? { - if let Some(mut dir_snapshot) = SnapshotDir::from_imfs(imfs, folder_entry)? { + if let Some(dir_snapshot) = SnapshotDir::from_imfs(imfs, folder_entry)? { if let Some(mut init_snapshot) = snapshot_lua_file(imfs, &init_entry)? { init_snapshot.name = dir_snapshot.name; init_snapshot.children = dir_snapshot.children; + // TODO: Metadata + // TODO: Validate directory class name is "Folder" return Ok(Some(init_snapshot)); } diff --git a/src/web/api.rs b/src/web/api.rs index 759b3ea9..03962d03 100644 --- a/src/web/api.rs +++ b/src/web/api.rs @@ -53,11 +53,15 @@ impl ApiService { /// Get a summary of information about the server fn handle_api_rojo(&self) -> Response { + let tree = self.serve_session.tree(); + let root_instance_id = tree.get_root_id(); + response_json(&ServerInfoResponse { server_version: SERVER_VERSION.to_owned(), protocol_version: PROTOCOL_VERSION, session_id: self.serve_session.session_id(), - expected_place_ids: self.serve_session.serve_place_ids().map(Clone::clone), + expected_place_ids: self.serve_session.serve_place_ids().cloned(), + root_instance_id, }) } diff --git a/src/web/interface.rs b/src/web/interface.rs index 1ed2bd94..7f8d5d82 100644 --- a/src/web/interface.rs +++ b/src/web/interface.rs @@ -2,6 +2,7 @@ use std::collections::HashSet; +use rbx_dom_weak::RbxId; use serde::{Deserialize, Serialize}; use crate::session_id::SessionId; @@ -20,7 +21,7 @@ pub struct ServerInfoResponse { pub server_version: String, pub protocol_version: u64, pub expected_place_ids: Option>, - // pub root_instance_id: RbxId, + pub root_instance_id: RbxId, } /// Response body from /api/read/{id}