use async_trait::async_trait;
use std::sync::Arc;
#[async_trait]
pub trait Service: Send + Sync {
fn name(&self) -> &str;
}
pub struct DependencyContext {
services: std::collections::HashMap<String, Arc<dyn Service>>,
}
impl DependencyContext {
pub fn new() -> Self {
Self {
services: std::collections::HashMap::new(),
}
}
pub fn register<T: Service + 'static>(mut self, service: T) -> Self {
self.services.insert(service.name().to_string(), Arc::new(service));
self
}
pub fn get(&self, name: &str) -> Option<Arc<dyn Service>> {
self.services.get(name).cloned()
}
pub fn contains(&self, name: &str) -> bool {
self.services.contains_key(name)
}
}
impl Default for DependencyContext {
fn default() -> Self {
Self::new()
}
}
pub struct ServiceBuilder {
context: DependencyContext,
}
impl ServiceBuilder {
pub fn new() -> Self {
Self {
context: DependencyContext::new(),
}
}
pub fn add<T: Service + 'static>(mut self, service: T) -> Self {
self.context = self.context.register(service);
self
}
pub fn build(self) -> DependencyContext {
self.context
}
}
impl Default for ServiceBuilder {
fn default() -> Self {
Self::new()
}
}