toni 0.1.0

Fast and modular web framework for scalable applications
Documentation
use std::{collections::hash_map::Drain, sync::Arc};

use rustc_hash::{FxHashMap, FxHashSet};

use crate::traits_helpers::{Controller, ControllerTrait, ModuleMetadata, Provider, ProviderTrait};
pub struct Module {
    _token: String,
    _name: String,
    controllers: FxHashMap<String, Box<dyn Controller>>,
    providers: FxHashMap<String, Box<dyn Provider>>,
    imports: FxHashSet<String>,
    exports: FxHashSet<String>,
    controllers_instances: FxHashMap<String, Arc<Box<dyn ControllerTrait>>>,
    providers_instances: FxHashMap<String, Arc<Box<dyn ProviderTrait>>>,
    exports_instances: FxHashSet<String>,
    metadata: Box<dyn ModuleMetadata>,
}

impl Module {
    pub fn new(token: &str, name: &str, metadata: Box<dyn ModuleMetadata>) -> Self {
        Self {
            _token: token.to_owned(),
            _name: name.to_string(),
            controllers: FxHashMap::default(),
            providers: FxHashMap::default(),
            imports: FxHashSet::default(),
            exports: FxHashSet::default(),
            controllers_instances: FxHashMap::default(),
            providers_instances: FxHashMap::default(),
            exports_instances: FxHashSet::default(),
            metadata,
        }
    }
}
impl Module {
    pub fn add_controller(&mut self, controller: Box<dyn Controller>) {
        self.controllers.insert(controller.get_name(), controller);
    }

    pub fn add_provider(&mut self, provider: Box<dyn Provider>) {
        self.providers.insert(provider.get_name(), provider);
    }

    pub fn add_import(&mut self, module_token: String) {
        self.imports.insert(module_token);
    }

    pub fn add_export(&mut self, provider_token: String) {
        self.exports.insert(provider_token);
    }

    pub fn add_controller_instance(&mut self, controller: Arc<Box<dyn ControllerTrait>>) {
        self.controllers_instances
            .insert(controller.get_token(), controller);
    }
    pub fn add_provider_instance(&mut self, provider: Arc<Box<dyn ProviderTrait>>) {
        self.providers_instances
            .insert(provider.get_token(), provider);
    }
    pub fn add_export_instance(&mut self, provider_token: String) {
        self.exports_instances.insert(provider_token);
    }

    pub fn get_providers_manager(&self) -> &FxHashMap<String, Box<dyn Provider>> {
        &self.providers
    }

    pub fn get_providers_instances(&self) -> &FxHashMap<String, Arc<Box<dyn ProviderTrait>>> {
        &self.providers_instances
    }

    pub fn get_provider_by_token(&self, provider_token: &String) -> Option<&dyn Provider> {
        self.providers.get(provider_token).map(|provider| provider.as_ref())
    }

    pub fn get_provider_instance_by_token(
        &self,
        provider_token: &String,
    ) -> Option<&Arc<Box<dyn ProviderTrait>>> {
        self.providers_instances.get(provider_token)
    }

    pub fn get_controllers_manager(&self) -> &FxHashMap<String, Box<dyn Controller>> {
        &self.controllers
    }

    pub fn drain_controllers_instances(&mut self) -> Drain<'_, String, Arc<Box<dyn ControllerTrait>>> {
        self.controllers_instances.drain()
    }

    pub fn get_imported_modules(&self) -> &FxHashSet<String> {
        &self.imports
    }

    pub fn get_exports_instances_tokens(&self) -> &FxHashSet<String> {
        &self.exports_instances
    }

    pub fn get_exports_tokens(&self) -> &FxHashSet<String> {
        &self.exports
    }

    pub fn get_metadata(&self) -> &dyn ModuleMetadata {
        &*self.metadata
    }

    pub fn _get_name(&self) -> &String {
        &self._name
    }

    pub fn _get_token(&self) -> &String {
        &self._token
    }

    pub fn _get_controller_by_token(
        &self,
        controller_token: &String,
    ) -> Option<&dyn Controller> {
        self.controllers.get(controller_token).map(|controller| controller.as_ref())
    }

    pub fn _get_controllers_instances(&self) -> &FxHashMap<String, Arc<Box<dyn ControllerTrait>>> {
        &self.controllers_instances
    }

    pub fn _take_controllers_instances(&mut self) -> FxHashMap<String, Arc<Box<dyn ControllerTrait>>> {
        std::mem::take(&mut self.controllers_instances)
    }
}