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
use crate::Consumer; use actix::Actor; use core::marker::PhantomData; use fnv::FnvHashMap; use std::any::{Any, TypeId}; pub struct JobContext<C: Consumer + Actor> { data: FnvHashMap<TypeId, Box<dyn Any + Sync + Send>>, consumer: PhantomData<C>, } impl<C: Consumer + Actor> JobContext<C> { pub fn new() -> Self { JobContext { data: FnvHashMap::default(), consumer: PhantomData, } } pub fn data_opt<D: Any + Send + Sync>(&self) -> Option<&D> { self.data .get(&TypeId::of::<D>()) .and_then(|d| d.downcast_ref::<D>()) } pub fn insert<D: Any + Send + Sync>(&mut self, data: D) { self.data.insert(TypeId::of::<D>(), Box::new(data)); } }