coerce 0.8.6

Async actor runtime and distributed systems framework
Documentation
//! Coerce Actor Persistence

pub mod actor;
pub mod batch;
pub mod context;
pub mod failure;
pub mod inspect;
pub mod journal;
pub mod recovery;

pub use actor::*;
pub use failure::*;
pub use journal::*;
pub use recovery::*;

use std::any::TypeId;
use std::collections::HashMap;

use crate::persistent::journal::provider::{StorageProvider, StorageProviderRef};
use std::sync::Arc;

#[derive(Clone)]
pub struct Persistence {
    default_provider: StorageProviderRef,
    actor_type_specific_providers: HashMap<TypeId, StorageProviderRef>,
}

impl<S: StorageProvider> From<S> for Persistence {
    fn from(value: S) -> Self {
        Persistence::from(value)
    }
}

impl Persistence {
    pub fn from<S: StorageProvider>(provider: S) -> Persistence {
        let default_provider = Arc::new(provider);
        Persistence {
            default_provider,
            actor_type_specific_providers: HashMap::new(),
        }
    }

    pub fn actor_provider<A: PersistentActor, S: StorageProvider>(mut self, provider: S) -> Self {
        let actor_type = TypeId::of::<A>();
        self.actor_type_specific_providers
            .insert(actor_type, Arc::new(provider));
        self
    }

    pub fn provider(&self, actor_type_id: TypeId) -> StorageProviderRef {
        self.actor_type_specific_providers
            .get(&actor_type_id)
            .map_or_else(|| self.default_provider.clone(), |s| s.clone())
    }
}