From 80be61ed78e8410e013cb94879435d54a4907c30 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 2 Sep 2018 14:46:15 +0300 Subject: project model --- crates/server/src/main_loop/mod.rs | 39 ++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) (limited to 'crates/server/src/main_loop') diff --git a/crates/server/src/main_loop/mod.rs b/crates/server/src/main_loop/mod.rs index ff267fcad..52fc00c9c 100644 --- a/crates/server/src/main_loop/mod.rs +++ b/crates/server/src/main_loop/mod.rs @@ -22,6 +22,7 @@ use { vfs::{self, FileEvent}, server_world::{ServerWorldState, ServerWorld}, main_loop::subscriptions::{Subscriptions}, + project_model::{CargoWorkspace, workspace_loader}, }; #[derive(Debug)] @@ -37,20 +38,24 @@ pub fn main_loop( ) -> Result<()> { let pool = ThreadPool::new(4); let (task_sender, task_receiver) = bounded::(16); - let (fs_events_receiver, watcher) = vfs::watch(vec![root]); + let (fs_events_receiver, watcher) = vfs::watch(vec![root.clone()]); + let (ws_root_sender, ws_receiver, ws_watcher) = workspace_loader(); + ws_root_sender.send(root); info!("server initialized, serving requests"); let mut state = ServerWorldState::new(); let mut pending_requests = HashMap::new(); let mut subs = Subscriptions::new(); - let res = main_loop_inner( + let main_res = main_loop_inner( &pool, msg_receriver, msg_sender, task_receiver.clone(), task_sender, fs_events_receiver, + ws_root_sender, + ws_receiver, &mut state, &mut pending_requests, &mut subs, @@ -63,10 +68,14 @@ pub fn main_loop( pool.join(); info!("...threadpool has finished"); - info!("waiting for file watcher to finish..."); - watcher.stop()?; - info!("...file watcher has finished"); - res + let vfs_res = watcher.stop(); + let ws_res = ws_watcher.stop(); + + main_res?; + vfs_res?; + ws_res?; + + Ok(()) } fn main_loop_inner( @@ -76,6 +85,8 @@ fn main_loop_inner( task_receiver: Receiver, task_sender: Sender, fs_receiver: Receiver>, + _ws_roots_sender: Sender, + ws_receiver: Receiver>, state: &mut ServerWorldState, pending_requests: &mut HashMap, subs: &mut Subscriptions, @@ -87,6 +98,7 @@ fn main_loop_inner( Msg(RawMessage), Task(Task), Fs(Vec), + Ws(Result), FsWatcherDead, } trace!("selecting"); @@ -100,6 +112,10 @@ fn main_loop_inner( Some(events) => Event::Fs(events), None => Event::FsWatcherDead, } + recv(ws_receiver, ws) => match ws { + None => bail!("workspace watcher died"), + Some(ws) => Event::Ws(ws), + } }; trace!("selected {:?}", event); let mut state_changed = false; @@ -111,6 +127,17 @@ fn main_loop_inner( state.apply_fs_changes(events); state_changed = true; } + Event::Ws(ws) => { + match ws { + Ok(ws) => { + let not = RawNotification::new::(vec![ws.clone()]); + msg_sender.send(RawMessage::Notification(not)); + state.set_workspaces(vec![ws]); + state_changed = true; + } + Err(e) => warn!("loading workspace failed: {}", e), + } + } Event::Msg(msg) => { match msg { RawMessage::Request(req) => { -- cgit v1.2.3