neovim_lib/rpc/
handler.rs1use 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}