visualizer_cli/
rpc.rs

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}