event.rs

 1//! Provides an abstract event type which can be downcasted into a more specific one.
 2//!
 3//! # Examples
 4//!
 5//! ```
 6//! use xmpp::event::{Event, AbstractEvent};
 7//!
 8//! #[derive(Debug, PartialEq, Eq)]
 9//! struct EventA;
10//!
11//! impl Event for EventA {}
12//!
13//! #[derive(Debug, PartialEq, Eq)]
14//! struct EventB;
15//!
16//! impl Event for EventB {}
17//!
18//! let event_a = AbstractEvent::new(EventA);
19//!
20//! assert_eq!(event_a.is::<EventA>(), true);
21//! assert_eq!(event_a.is::<EventB>(), false);
22//!
23//! assert_eq!(event_a.downcast::<EventA>(), Some(&EventA));
24//! assert_eq!(event_a.downcast::<EventB>(), None);
25//! ```
26
27use std::fmt::Debug;
28
29use std::any::Any;
30
31/// An abstract event.
32pub struct AbstractEvent {
33    inner: Box<Any>,
34}
35
36impl AbstractEvent {
37    /// Creates an abstract event from a concrete event.
38    pub fn new<E: Event>(event: E) -> AbstractEvent {
39        AbstractEvent {
40            inner: Box::new(event),
41        }
42    }
43
44    /// Downcasts this abstract event into a concrete event.
45    pub fn downcast<E: Event + 'static>(&self) -> Option<&E> {
46        self.inner.downcast_ref::<E>()
47    }
48
49    /// Checks whether this abstract event is a specific concrete event.
50    pub fn is<E: Event + 'static>(&self) -> bool {
51        self.inner.is::<E>()
52    }
53}
54
55/// A marker trait which all events must implement.
56pub trait Event: Any + Debug {}