aboutsummaryrefslogtreecommitdiff
path: root/codeless/server/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'codeless/server/src/main.rs')
-rw-r--r--codeless/server/src/main.rs50
1 files changed, 29 insertions, 21 deletions
diff --git a/codeless/server/src/main.rs b/codeless/server/src/main.rs
index 287d650fa..116abce1c 100644
--- a/codeless/server/src/main.rs
+++ b/codeless/server/src/main.rs
@@ -31,7 +31,7 @@ use languageserver_types::{TextDocumentItem, VersionedTextDocumentIdentifier, Te
31 31
32use ::{ 32use ::{
33 io::{Io, RawMsg}, 33 io::{Io, RawMsg},
34 handlers::handle_syntax_tree, 34 handlers::{handle_syntax_tree, handle_extend_selection},
35}; 35};
36 36
37pub type Result<T> = ::std::result::Result<T, ::failure::Error>; 37pub type Result<T> = ::std::result::Result<T, ::failure::Error>;
@@ -153,34 +153,42 @@ fn main_loop(
153 153
154 match msg { 154 match msg {
155 RawMsg::Request(req) => { 155 RawMsg::Request(req) => {
156 let req = match dispatch::parse_request_as::<req::SyntaxTree>(req)? { 156 let mut req = Some(req);
157 Ok((params, resp)) => { 157 dispatch::handle_request::<req::SyntaxTree, _>(&mut req, |params, resp| {
158 let world = world.snapshot(); 158 let world = world.snapshot();
159 let sender = sender.clone(); 159 let sender = sender.clone();
160 pool.execute(move || { 160 pool.execute(move || {
161 let res: Result<String> = handle_syntax_tree(world, params); 161 let res = handle_syntax_tree(world, params);
162 sender.send(Box::new(|io: &mut Io| resp.response(io, res))) 162 sender.send(Box::new(|io: &mut Io| resp.response(io, res)))
163 }); 163 });
164 continue; 164 Ok(())
165 } 165 })?;
166 Err(req) => req, 166 dispatch::handle_request::<req::ExtendSelection, _>(&mut req, |params, resp| {
167 }; 167 let world = world.snapshot();
168 168 let sender = sender.clone();
169 if let Some(((), resp)) = dispatch::expect_request::<req::Shutdown>(io, req)? { 169 pool.execute(move || {
170 info!("clean shutdown started"); 170 let res = handle_extend_selection(world, params);
171 sender.send(Box::new(|io: &mut Io| resp.response(io, res)))
172 });
173 Ok(())
174 })?;
175 dispatch::handle_request::<req::Shutdown, _>(&mut req, |(), resp| {
171 resp.result(io, ())?; 176 resp.result(io, ())?;
172 return Ok(()); 177 Ok(())
178 })?;
179 if let Some(req) = req {
180 error!("unknown method: {:?}", req);
181 dispatch::unknown_method(io, req)?;
173 } 182 }
174 } 183 }
175 RawMsg::Notification(not) => { 184 RawMsg::Notification(not) => {
176 use dispatch::handle_notification as h;
177 let mut not = Some(not); 185 let mut not = Some(not);
178 h::<req::DidOpenTextDocument, _>(&mut not, |params| { 186 dispatch::handle_notification::<req::DidOpenTextDocument, _>(&mut not, |params| {
179 let path = params.text_document.file_path()?; 187 let path = params.text_document.file_path()?;
180 world.change_overlay(path, Some(params.text_document.text)); 188 world.change_overlay(path, Some(params.text_document.text));
181 Ok(()) 189 Ok(())
182 })?; 190 })?;
183 h::<req::DidChangeTextDocument, _>(&mut not, |mut params| { 191 dispatch::handle_notification::<req::DidChangeTextDocument, _>(&mut not, |mut params| {
184 let path = params.text_document.file_path()?; 192 let path = params.text_document.file_path()?;
185 let text = params.content_changes.pop() 193 let text = params.content_changes.pop()
186 .ok_or_else(|| format_err!("empty changes"))? 194 .ok_or_else(|| format_err!("empty changes"))?
@@ -188,7 +196,7 @@ fn main_loop(
188 world.change_overlay(path, Some(text)); 196 world.change_overlay(path, Some(text));
189 Ok(()) 197 Ok(())
190 })?; 198 })?;
191 h::<req::DidCloseTextDocument, _>(&mut not, |params| { 199 dispatch::handle_notification::<req::DidCloseTextDocument, _>(&mut not, |params| {
192 let path = params.text_document.file_path()?; 200 let path = params.text_document.file_path()?;
193 world.change_overlay(path, None); 201 world.change_overlay(path, None);
194 Ok(()) 202 Ok(())