qlue_ls/
lib.rs

1mod server;
2mod sparql;
3
4use std::rc::Rc;
5
6use futures::lock::Mutex;
7use log::error;
8use server::{handle_message, Server};
9use wasm_bindgen::prelude::*;
10use wasm_bindgen_futures::JsFuture;
11use web_sys::js_sys;
12
13pub use server::format_raw;
14
15fn send_message(writer: &web_sys::WritableStreamDefaultWriter, message: String) {
16    let _future = JsFuture::from(writer.write_with_chunk(&message.into()));
17}
18
19#[wasm_bindgen]
20pub fn init_language_server(writer: web_sys::WritableStreamDefaultWriter) -> Server {
21    #[cfg(target_arch = "wasm32")]
22    wasm_logger::init(wasm_logger::Config::default());
23    #[cfg(target_arch = "wasm32")]
24    console_error_panic_hook::set_once();
25    Server::new(move |message| send_message(&writer, message))
26}
27
28async fn read_message(
29    reader: &web_sys::ReadableStreamDefaultReader,
30) -> Result<(String, bool), String> {
31    match JsFuture::from(reader.read()).await {
32        Ok(js_object) => {
33            let value = js_sys::Reflect::get(&js_object, &"value".into())
34                .map_err(|_| "\"value\" property not present in message")?
35                .as_string()
36                .ok_or("\"value\" is not a string")?;
37            let done = js_sys::Reflect::get(&js_object, &"done".into())
38                .map_err(|_| "\"done\" property not present in message")?
39                .as_bool()
40                .ok_or("\"done\" is not a boolean")?;
41            Ok((value, done))
42        }
43        Err(_) => Err("Error while reading from input-stream".to_string()),
44    }
45}
46
47#[wasm_bindgen]
48pub async fn listen(server: Server, reader: web_sys::ReadableStreamDefaultReader) {
49    let server_rc = Rc::new(Mutex::new(server));
50    loop {
51        match read_message(&reader).await {
52            Ok((value, done)) => {
53                handle_message(server_rc.clone(), value).await;
54                if done {
55                    break;
56                }
57            }
58            Err(e) => error!("{}", e),
59        }
60    }
61}
62
63// #[wasm_bindgen]
64// impl Server {
65//     pub async fn listen(&mut self, reader: web_sys::ReadableStreamDefaultReader) {
66//         loop {
67//             match read_message(&reader).await {
68//                 Ok((value, done)) => {
69//                     handle_message(rc_server.clone(), value).await;
70//                     if done {
71//                         break;
72//                     }
73//                 }
74//                 Err(e) => error!("{}", e),
75//             }
76//         }
77//     }
78// }