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};

/// An identifier for unsubscribing an event listener.
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
    }
}