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}