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
use super::event::{Event, EventType};
use super::dazeus::{DaZeus, DaZeusClient};
use std::fmt::{Debug, Error, Formatter};
use std::cell::RefCell;
use std::ops::DerefMut;
use std::io::{Read, Write};
pub type ListenerHandle = u64;
pub struct Listener<'a> {
pub event: EventType,
pub handle: ListenerHandle,
callback: RefCell<Box<FnMut(Event, &DaZeusClient) + 'a>>,
}
impl<'a> PartialEq for Listener<'a>{
fn eq(&self, other: &Self) -> bool {
self.handle == other.handle
}
}
impl<'a> Debug for Listener<'a> {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
write!(f, "Listener {{ event: {:?}, handle: {:?} callback: FnMut(Event) }}", self.event, self.handle)
}
}
impl<'a> Listener<'a> {
pub fn new<F>(handle: ListenerHandle, event_type: EventType, listener: F) -> Listener<'a>
where F: FnMut(Event, &DaZeusClient) + 'a
{
Listener { event: event_type, handle: handle, callback: RefCell::new(Box::new(listener)) }
}
pub fn call<T: Read + Write>(&self, event: Event, dazeus: &DaZeus<T>) {
let mut fbox = self.callback.borrow_mut();
let mut func = fbox.deref_mut();
func(event, dazeus as &DaZeusClient);
}
pub fn has_handle(&self, handle: ListenerHandle) -> bool {
self.handle == handle
}
}