sparql_language_server_web/
lib.rs

1mod server;
2
3use log::error;
4use server::Server;
5use wasm_bindgen::prelude::*;
6use wasm_bindgen_futures::JsFuture;
7use web_sys::js_sys;
8
9async fn read_message(
10    reader: &web_sys::ReadableStreamDefaultReader,
11) -> Result<(String, bool), String> {
12    match JsFuture::from(reader.read()).await {
13        Ok(js_object) => {
14            let value = js_sys::Reflect::get(&js_object, &"value".into())
15                .map_err(|_| "\"value\" property not present in message")?
16                .as_string()
17                .ok_or("\"value\" is not a string")?;
18            let done = js_sys::Reflect::get(&js_object, &"done".into())
19                .map_err(|_| "\"done\" property not present in message")?
20                .as_bool()
21                .ok_or("\"done\" is not a boolean")?;
22            Ok((value, done))
23        }
24        Err(_) => Err("Error while reading from input-stream".to_string()),
25    }
26}
27
28fn send_message(writer: &web_sys::WritableStreamDefaultWriter, message: String) {
29    let _future = JsFuture::from(writer.write_with_chunk(&message.into()));
30}
31
32#[wasm_bindgen]
33pub async fn start_language_server(
34    reader: web_sys::ReadableStreamDefaultReader,
35    writer: web_sys::WritableStreamDefaultWriter,
36) {
37    #[cfg(target_arch = "wasm32")]
38    wasm_logger::init(wasm_logger::Config::default());
39    let mut server = Server::new(move |message| send_message(&writer, message));
40    loop {
41        match read_message(&reader).await {
42            Ok((value, done)) => {
43                server.handle_message(value);
44                if done {
45                    break;
46                }
47            }
48            Err(e) => error!("{}", e),
49        }
50    }
51}