/
githubmirror
/
deno
Обзор
Документация
Войти
/
githubmirror
/
deno
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
cli/tools/repl/channel.rs
92 строки
2 KB
Bartek Iwańczuk
refactor: remove LSP integration from repl and jupyter (#33119)
01 апр 2026, 21:04
Не верифицирован
01 апр 2026, 21:04
d854112
Код
Авторство
О чём код?
// Copyright 2018-2026 the Deno authors. MIT license. use std::cell::RefCell; use deno_core::anyhow::anyhow; use deno_core::error::AnyError; use deno_core::serde_json; use deno_core::serde_json::Value; use deno_error::JsErrorBox; use tokio::sync::mpsc::Receiver; use tokio::sync::mpsc::Sender; use tokio::sync::mpsc::UnboundedReceiver; use tokio::sync::mpsc::UnboundedSender; use tokio::sync::mpsc::channel; use tokio::sync::mpsc::unbounded_channel; /// Rustyline uses synchronous methods in its interfaces, but we need to call /// async methods. To get around this, we communicate with async code by using /// a channel and blocking on the result. pub fn rustyline_channel() -> (RustylineSyncMessageSender, RustylineSyncMessageHandler) { let (message_tx, message_rx) = channel(1); let (response_tx, response_rx) = unbounded_channel(); ( RustylineSyncMessageSender { message_tx, response_rx: RefCell::new(response_rx), }, RustylineSyncMessageHandler { response_tx, message_rx, }, ) } pub enum RustylineSyncMessage { PostMessage { method: String, params: Option<Value>, }, } pub enum RustylineSyncResponse { PostMessage(Value), } pub struct RustylineSyncMessageSender { message_tx: Sender<RustylineSyncMessage>, response_rx: RefCell<UnboundedReceiver<RustylineSyncResponse>>, } impl RustylineSyncMessageSender { pub fn post_message<T: serde::Serialize>( &self, method: &str, params: Option<T>, ) -> Result<Value, JsErrorBox> { match self .message_tx .blocking_send(RustylineSyncMessage::PostMessage { method: method.to_string(), params: params .map(|params| serde_json::to_value(params)) .transpose() .map_err(JsErrorBox::from_err)?, }) { Err(err) => Err(JsErrorBox::from_err(err)), _ => match self.response_rx.borrow_mut().blocking_recv().unwrap() { RustylineSyncResponse::PostMessage(result) => Ok(result), }, } } } pub struct RustylineSyncMessageHandler { message_rx: Receiver<RustylineSyncMessage>, response_tx: UnboundedSender<RustylineSyncResponse>, } impl RustylineSyncMessageHandler { pub async fn recv(&mut self) -> Option<RustylineSyncMessage> { self.message_rx.recv().await } pub fn send(&self, response: RustylineSyncResponse) -> Result<(), AnyError> { self .response_tx .send(response) .map_err(|err| anyhow!("{}", err)) } }