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