rpc_core/
connection.rs

1use std::cell::RefCell;
2use std::rc::Rc;
3
4pub trait Connection {
5    fn set_send_package_impl(&mut self, handle: Box<dyn Fn(Vec<u8>)>);
6    fn send_package(&self, package: Vec<u8>);
7    fn set_recv_package_impl(&mut self, handle: Box<dyn Fn(Vec<u8>)>);
8    fn on_recv_package(&self, package: Vec<u8>);
9}
10
11#[derive(Default)]
12pub struct DefaultConnection {
13    send_package_impl: Option<Box<dyn Fn(Vec<u8>)>>,
14    recv_package_impl: Option<Box<dyn Fn(Vec<u8>)>>,
15}
16
17impl DefaultConnection {
18    pub fn new() -> Rc<RefCell<Self>> {
19        Rc::new(RefCell::from(DefaultConnection::default()))
20    }
21}
22
23impl Connection for DefaultConnection {
24    fn set_send_package_impl(&mut self, handle: Box<dyn Fn(Vec<u8>)>) {
25        self.send_package_impl = Some(handle);
26    }
27
28    fn send_package(&self, package: Vec<u8>) {
29        if let Some(handle) = self.send_package_impl.as_ref() {
30            handle(package);
31        }
32    }
33
34    fn set_recv_package_impl(&mut self, handle: Box<dyn Fn(Vec<u8>)>) {
35        self.recv_package_impl = Some(handle);
36    }
37
38    fn on_recv_package(&self, package: Vec<u8>) {
39        if let Some(handle) = self.recv_package_impl.as_ref() {
40            handle(package);
41        }
42    }
43}
44
45pub struct LoopbackConnection;
46
47impl LoopbackConnection {
48    pub fn new() -> (
49        Rc<RefCell<DefaultConnection>>,
50        Rc<RefCell<DefaultConnection>>,
51    ) {
52        let c1 = Rc::new(RefCell::new(DefaultConnection::default()));
53        let c1_weak = Rc::downgrade(&c1);
54        let c2 = Rc::new(RefCell::new(DefaultConnection::default()));
55        let c2_weak = Rc::downgrade(&c2);
56
57        c1.borrow_mut().send_package_impl = Some(Box::new(move |package: Vec<u8>| {
58            c2_weak.upgrade().unwrap().borrow().on_recv_package(package);
59        }));
60        c2.borrow_mut().send_package_impl = Some(Box::new(move |package: Vec<u8>| {
61            c1_weak.upgrade().unwrap().borrow().on_recv_package(package);
62        }));
63        (c1, c2)
64    }
65}