sparql_language_server_web/
lib.rs1mod 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}