use std::{cell::RefCell, rc::Rc};
use dioxus::prelude::*;
use crate::lsp::{
lsp_message::LspMessage, lsp_pusher::LspMessageRx, lsp_server::LspServer,
lsp_server_async::LspServerAsync,
};
#[derive(Clone)]
pub struct LspBridge {
pub uri: String,
pub on_message_to_server: Callback<LspMessage, Vec<LspMessage>>,
messages_pushed_rx: Rc<RefCell<Option<LspMessageRx>>>,
}
impl PartialEq for LspBridge {
fn eq(&self, other: &Self) -> bool {
self.uri == other.uri
&& self.on_message_to_server == other.on_message_to_server
&& Rc::ptr_eq(&self.messages_pushed_rx, &other.messages_pushed_rx)
}
}
impl LspBridge {
pub fn lsp_bridge_from_server<S>(uri: impl Into<String>, mut server: Signal<S>) -> Self
where
S: LspServer + 'static,
{
let on_message_to_server =
use_callback(move |message: LspMessage| server.write().lsp_message_handle(message));
let messages_pushed_rx = use_hook(|| Rc::new(RefCell::new(None)));
Self {
uri: uri.into(),
on_message_to_server,
messages_pushed_rx,
}
}
pub fn lsp_bridge_from_server_async<S>(uri: impl Into<String>, mut server: Signal<S>) -> Self
where
S: LspServerAsync + 'static,
{
let messages_pushed_rx = use_hook(|| {
let (pusher, message_rx) = crate::lsp::lsp_pusher::LspPusher::lsp_pusher_new();
server.write().lsp_pusher_set(pusher);
Rc::new(RefCell::new(Some(message_rx)))
});
let on_message_to_server = use_callback(move |message: LspMessage| {
server.write().lsp_message_handle(message);
Vec::new()
});
Self {
uri: uri.into(),
on_message_to_server,
messages_pushed_rx,
}
}
pub(crate) fn messages_pushed_rx_take(&self) -> Option<LspMessageRx> {
self.messages_pushed_rx.borrow_mut().take()
}
}