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));
    }
}