use super::instance::Instance;
use crate::abi::{EntityId, InstanceId, Tick};
pub struct ActionContext<'a> {
pub actor: Option<EntityId>,
pub now: Tick,
pub instance_id: InstanceId,
pub(crate) instance: &'a Instance,
}
impl<'a> ActionContext<'a> {
pub(crate) fn new(
actor: Option<EntityId>,
now: Tick,
instance_id: InstanceId,
instance: &'a Instance,
) -> Self {
Self {
actor,
now,
instance_id,
instance,
}
}
#[inline]
pub fn entities_len(&self) -> usize {
self.instance.entities_len()
}
#[inline]
pub fn components_len(&self) -> usize {
self.instance.components_len()
}
#[inline]
pub fn local_tick(&self) -> u64 {
self.instance.local_tick()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::state::InstanceConfig;
#[test]
fn context_accessor_matches_instance() {
let inst = Instance::new(InstanceId::new(7).unwrap(), InstanceConfig::default());
let ctx = ActionContext {
actor: Some(EntityId::new(1).unwrap()),
now: Tick(0),
instance_id: InstanceId::new(7).unwrap(),
instance: &inst,
};
assert_eq!(ctx.entities_len(), 0);
assert_eq!(ctx.components_len(), 0);
assert_eq!(ctx.local_tick(), 0);
assert_eq!(ctx.now, Tick(0));
assert_eq!(ctx.instance_id, InstanceId::new(7).unwrap());
assert_eq!(ctx.actor, Some(EntityId::new(1).unwrap()));
}
}