neovim_lib/rpc/
handler.rs

1use rmpv::Value;
2use std::sync::mpsc;
3
4pub trait RequestHandler {
5    fn handle_request(&mut self, _name: &str, _args: Vec<Value>) -> Result<Value, Value> {
6        Err(Value::from("Not implemented"))
7    }
8}
9
10pub trait Handler: RequestHandler {
11    fn handle_notify(&mut self, _name: &str, _args: Vec<Value>) {}
12}
13
14pub struct DefaultHandler();
15
16impl RequestHandler for DefaultHandler {}
17impl Handler for DefaultHandler {}
18
19pub struct ChannelHandler<H: RequestHandler> {
20    sender: mpsc::Sender<(String, Vec<Value>)>,
21    request_handler: H,
22}
23
24impl<H: RequestHandler> Handler for ChannelHandler<H> {
25    fn handle_notify(&mut self, name: &str, args: Vec<Value>) {
26        self.sender.send((name.to_owned(), args)).unwrap()
27    }
28}
29
30impl<H: RequestHandler> RequestHandler for ChannelHandler<H> {
31    fn handle_request(&mut self, name: &str, args: Vec<Value>) -> Result<Value, Value> {
32        self.request_handler.handle_request(name, args)
33    }
34}
35
36impl<H: RequestHandler> ChannelHandler<H> {
37    pub fn new(request_handler: H) -> (Self, mpsc::Receiver<(String, Vec<Value>)>) {
38        let (sender, receiver) = mpsc::channel();
39        (
40            ChannelHandler {
41                request_handler,
42                sender,
43            },
44            receiver,
45        )
46    }
47}
48
49pub fn channel<H: RequestHandler>(
50    request_handler: H,
51) -> (ChannelHandler<H>, mpsc::Receiver<(String, Vec<Value>)>) {
52    ChannelHandler::new(request_handler)
53}