1use std::cell::RefCell;
2
3use async_std::{sync::Mutex, task::block_on};
4use jsonrpc_stdio_server::jsonrpc_core::*;
5use jsonrpc_stdio_server::ServerBuilder;
6use serde_json::value::RawValue;
7use std::boxed::Box;
8use tokio;
9
10use crate::{debug_visualizer_app::WindowOptions, DebugVisualizerAppProxy};
11use crate::{rpc_trait::VisualizerRpcServer, DebugVisualizerWindow};
12
13struct RpcState {
14 app: DebugVisualizerAppProxy,
15 window: Option<DebugVisualizerWindow>,
16}
17
18struct VisualizerRpcServerImpl {
19 state: Mutex<RefCell<RpcState>>,
20}
21
22impl VisualizerRpcServer for VisualizerRpcServerImpl {
23 fn show_visualization(&self, data: Box<RawValue>) -> Result<()> {
24 block_on(async move {
25 let m = self.state.lock().await;
26 let mut s = m.borrow_mut();
27 if s.window.is_none() {
28 let w = s.app.new_window(WindowOptions { title: None }).unwrap();
29 s.window = Some(w);
30 }
31 s.window
32 .as_ref()
33 .unwrap()
34 .show_visualization_data(&data.to_string())
35 .await
36 .unwrap();
37
38 Ok(())
39 })
40 }
41}
42
43impl VisualizerRpcServerImpl {
44 pub fn new(app: DebugVisualizerAppProxy) -> Self {
45 Self {
46 state: Mutex::new(RefCell::new(RpcState { app, window: None })),
47 }
48 }
49}
50
51#[tokio::main]
52pub async fn run_rpc(app: DebugVisualizerAppProxy) {
53 let mut io = IoHandler::default();
54 io.extend_with(VisualizerRpcServerImpl::new(app).to_delegate());
55
56 let server = ServerBuilder::new(io).build();
57 server.await;
58}