diff --git a/drust/src/main.rs b/drust/src/main.rs index 27bb0886..6b610c8b 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,9 +1,9 @@ use pagetop::prelude::*; fn bootstrap() { - register_module(&pagetop_admin::Admin); - register_module(&pagetop_user::User); - register_module(&pagetop_node::Node); + include_module(&pagetop_admin::Admin); + include_module(&pagetop_user::User); + include_module(&pagetop_node::Node); } #[actix_web::main] diff --git a/pagetop/src/api/component/assets.rs b/pagetop/src/api/component/assets.rs index aa05ebd5..1ff78d23 100644 --- a/pagetop/src/api/component/assets.rs +++ b/pagetop/src/api/component/assets.rs @@ -4,7 +4,7 @@ use crate::html::{Markup, PreEscaped, html}; use crate::api::theme::*; static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { - match theme_by_name(&SETTINGS.app.theme) { + match theme_by_single_name(&SETTINGS.app.theme) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, } @@ -197,7 +197,7 @@ impl Assets { } pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { - self.theme = theme_by_name(theme_name).unwrap_or(*DEFAULT_THEME); + self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); self } diff --git a/pagetop/src/api/module/all.rs b/pagetop/src/api/module/all.rs index 1bb6ea7d..778dba2e 100644 --- a/pagetop/src/api/module/all.rs +++ b/pagetop/src/api/module/all.rs @@ -10,7 +10,7 @@ static MODULES: Lazy>> = Lazy::new(|| { RwLock::new(Vec::new()) }); -pub fn register_module(module: &'static dyn ModuleTrait) { +pub fn include_module(module: &'static dyn ModuleTrait) { let mut list: Vec<&dyn ModuleTrait> = Vec::new(); add_to(&mut list, module); list.reverse(); @@ -20,7 +20,7 @@ pub fn register_module(module: &'static dyn ModuleTrait) { fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { if !MODULES.read().unwrap().iter().any(|m| m.handler() == module.handler()) { if !list.iter().any(|m| m.handler() == module.handler()) { - trace::debug!("Register module: \"{}\"", module.name()); + trace::debug!("Including module \"{}\"", module.single_name()); list.push(module); let mut dependencies = module.dependencies(); diff --git a/pagetop/src/api/module/definition.rs b/pagetop/src/api/module/definition.rs index 1deb7d80..e457e3f0 100644 --- a/pagetop/src/api/module/definition.rs +++ b/pagetop/src/api/module/definition.rs @@ -4,18 +4,26 @@ use crate::api::action::ActionItem; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db::MigrationItem; +pub trait BaseModule { + fn single_name(&self) -> &'static str; +} + /// Los módulos deben implementar este *trait*. -pub trait ModuleTrait: Send + Sync { +pub trait ModuleTrait: BaseModule + Send + Sync { fn handler(&self) -> &'static str; fn name(&self) -> String { - util::single_type_name::().to_owned() + self.single_name().to_owned() } fn description(&self) -> Option { None } + fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> { + vec![] + } + #[allow(unused_variables)] fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { } @@ -29,8 +37,10 @@ pub trait ModuleTrait: Send + Sync { fn migrations(&self) -> Vec { vec![] } +} - fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> { - vec![] +impl BaseModule for M { + fn single_name(&self) -> &'static str { + util::single_type_name::() } } diff --git a/pagetop/src/api/module/mod.rs b/pagetop/src/api/module/mod.rs index b4a97393..9c186aea 100644 --- a/pagetop/src/api/module/mod.rs +++ b/pagetop/src/api/module/mod.rs @@ -1,5 +1,10 @@ mod definition; -pub use definition::ModuleTrait; +pub use definition::{ + BaseModule, + ModuleTrait, +}; pub(crate) mod all; -pub use all::register_module; +pub use all::{ + include_module, +}; diff --git a/pagetop/src/api/theme/all.rs b/pagetop/src/api/theme/all.rs index b1e47307..c4bb54fe 100644 --- a/pagetop/src/api/theme/all.rs +++ b/pagetop/src/api/theme/all.rs @@ -13,14 +13,14 @@ static THEMES: Lazy>> = Lazy::new(|| { pub fn register_theme(theme: &'static dyn ThemeTrait) { let mut themes = THEMES.write().unwrap(); if !themes.iter().any(|t| t.handler() == theme.handler()) { - trace::debug!("Register theme: \"{}\"", theme.name()); + trace::debug!("Registering theme \"{}\"", theme.single_name()); themes.push(theme); } } -pub fn theme_by_name(name: &str) -> Option<&'static dyn ThemeTrait> { +pub fn theme_by_single_name(single_name: &str) -> Option<&'static dyn ThemeTrait> { match THEMES.write().unwrap().iter().find( - |t| t.name().to_lowercase() == name.to_lowercase() + |t| t.single_name().to_lowercase() == single_name.to_lowercase() ) { Some(theme) => Some(*theme), _ => None, diff --git a/pagetop/src/api/theme/definition.rs b/pagetop/src/api/theme/definition.rs index e063b355..d5ca1db0 100644 --- a/pagetop/src/api/theme/definition.rs +++ b/pagetop/src/api/theme/definition.rs @@ -5,12 +5,16 @@ use crate::api::component::{Assets, ComponentTrait, Favicon}; use crate::response::page::Page; use crate::base::component::Chunck; +pub trait BaseTheme { + fn single_name(&self) -> &'static str; +} + /// Los temas deben implementar este "trait". -pub trait ThemeTrait: Send + Sync { +pub trait ThemeTrait: BaseTheme + Send + Sync { fn handler(&self) -> &'static str; fn name(&self) -> String { - util::single_type_name::().to_owned() + self.single_name().to_owned() } fn description(&self) -> Option { @@ -130,3 +134,9 @@ pub trait ThemeTrait: Send + Sync { .render() } } + +impl BaseTheme for T { + fn single_name(&self) -> &'static str { + util::single_type_name::() + } +} diff --git a/pagetop/src/api/theme/mod.rs b/pagetop/src/api/theme/mod.rs index 4456189e..ccb55a6d 100644 --- a/pagetop/src/api/theme/mod.rs +++ b/pagetop/src/api/theme/mod.rs @@ -1,8 +1,11 @@ mod definition; -pub use definition::ThemeTrait; +pub use definition::{ + BaseTheme, + ThemeTrait, +}; pub(crate) mod all; pub use all::{ register_theme, - theme_by_name, + theme_by_single_name, }; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 98a49f80..6432e265 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -40,7 +40,7 @@ impl Application { // Registra el módulo de presentación de PageTop. // Normalmente se sobrecargará en la función de inicio. - module::register_module(&base::module::demopage::Demopage); + module::include_module(&base::module::demopage::Demopage); // Registra las acciones de todos los módulos. module::all::register_actions();