use component::*;
use event::*;
use logging::*;
use sim_time::*;
use store::*;
use std::f64::EPSILON;
pub struct Effector
{
pub(crate) logs: Vec<LogRecord>,
pub(crate) events: Vec<(ComponentID, Event, f64)>,
pub(crate) store: Store,
pub(crate) exit: bool,
pub(crate) removed: bool,
}
impl Effector
{
pub fn new() -> Effector
{
Effector{logs: Vec::new(), events: Vec::new(), store: Store::new(), exit: false, removed: false}
}
pub fn log(&mut self, level: LogLevel, message: &str)
{
self.logs.push(LogRecord{level, message: message.to_string()});
}
pub fn schedule_after_secs(&mut self, event: Event, to: ComponentID, secs: f64)
{
assert!(to != NO_COMPONENT);
assert!(secs > 0.0, "secs ({:.3}) is not positive", secs);
self.events.push((to, event, secs));
}
pub fn schedule_immediately(&mut self, event: Event, to: ComponentID)
{
assert!(to != NO_COMPONENT);
self.events.push((to, event, EPSILON));
}
pub fn exit(&mut self)
{
self.exit = true;
}
pub fn remove(&mut self)
{
self.removed = true;
}
pub fn set_int(&mut self, name: &str, value: i64)
{
assert!(!name.is_empty(), "name should not be empty");
self.store.set_int(name, value, Time(0));
}
pub fn set_float(&mut self, name: &str, value: f64)
{
assert!(!name.is_empty(), "name should not be empty");
self.store.set_float(name, value, Time(0));
}
pub fn set_string(&mut self, name: &str, value: &str)
{
assert!(!name.is_empty(), "name should not be empty");
self.store.set_string(name, value, Time(0));
}
}
pub(crate) struct LogRecord
{
pub(crate) level: LogLevel,
pub(crate) message: String,
}