use std::any::Any;
pub struct Event
{
pub name: String,
pub port_name: String,
pub payload: Option<Box<Any + Send>>,
}
impl Event
{
pub fn new(name: &str) -> Event
{
assert!(!name.is_empty(), "name should not be empty");
Event{name: name.to_string(), port_name: "".to_string(), payload: None}
}
pub fn with_payload<T: Any + Send>(name: &str, payload: T) -> Event
{
assert!(!name.is_empty(), "name should not be empty");
Event{name: name.to_string(), port_name: "".to_string(), payload: Some(Box::new(payload))}
}
pub fn with_port(name: &str, port: &str) -> Event
{
assert!(!name.is_empty(), "name should not be empty");
Event{name: name.to_string(), port_name: port.to_string(), payload: None}
}
pub fn with_port_payload<T: Any + Send>(name: &str, port: &str, payload: T) -> Event
{
assert!(!name.is_empty(), "name should not be empty");
Event{name: name.to_string(), port_name: port.to_string(), payload: Some(Box::new(payload))}
}
pub fn expect_payload<T: Any>(&self, message: &str) -> &T
{
if let Some(ref value) = self.payload {
if let Some(x) = value.downcast_ref::<T>() {
x
} else {
panic!("event {} {} (downcast failed)", self.name, message);
}
} else {
panic!("event {} {} (missing payload)", self.name, message);
}
}
}