Modifica identificación de módulos y temas

This commit is contained in:
Manuel Cillero 2022-05-08 01:02:07 +02:00
parent 3366a6acdc
commit af9afca777
9 changed files with 49 additions and 21 deletions

View file

@ -1,9 +1,9 @@
use pagetop::prelude::*; use pagetop::prelude::*;
fn bootstrap() { fn bootstrap() {
register_module(&pagetop_admin::Admin); include_module(&pagetop_admin::Admin);
register_module(&pagetop_user::User); include_module(&pagetop_user::User);
register_module(&pagetop_node::Node); include_module(&pagetop_node::Node);
} }
#[actix_web::main] #[actix_web::main]

View file

@ -4,7 +4,7 @@ use crate::html::{Markup, PreEscaped, html};
use crate::api::theme::*; use crate::api::theme::*;
static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { 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, Some(theme) => theme,
None => &base::theme::bootsier::Bootsier, None => &base::theme::bootsier::Bootsier,
} }
@ -197,7 +197,7 @@ impl Assets {
} }
pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { 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 self
} }

View file

@ -10,7 +10,7 @@ static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| {
RwLock::new(Vec::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(); let mut list: Vec<&dyn ModuleTrait> = Vec::new();
add_to(&mut list, module); add_to(&mut list, module);
list.reverse(); 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) { fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) {
if !MODULES.read().unwrap().iter().any(|m| m.handler() == module.handler()) { if !MODULES.read().unwrap().iter().any(|m| m.handler() == module.handler()) {
if !list.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); list.push(module);
let mut dependencies = module.dependencies(); let mut dependencies = module.dependencies();

View file

@ -4,18 +4,26 @@ use crate::api::action::ActionItem;
#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))]
use crate::db::MigrationItem; use crate::db::MigrationItem;
pub trait BaseModule {
fn single_name(&self) -> &'static str;
}
/// Los módulos deben implementar este *trait*. /// Los módulos deben implementar este *trait*.
pub trait ModuleTrait: Send + Sync { pub trait ModuleTrait: BaseModule + Send + Sync {
fn handler(&self) -> &'static str; fn handler(&self) -> &'static str;
fn name(&self) -> String { fn name(&self) -> String {
util::single_type_name::<Self>().to_owned() self.single_name().to_owned()
} }
fn description(&self) -> Option<String> { fn description(&self) -> Option<String> {
None None
} }
fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> {
vec![]
}
#[allow(unused_variables)] #[allow(unused_variables)]
fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { fn configure_service(&self, cfg: &mut app::web::ServiceConfig) {
} }
@ -29,8 +37,10 @@ pub trait ModuleTrait: Send + Sync {
fn migrations(&self) -> Vec<MigrationItem> { fn migrations(&self) -> Vec<MigrationItem> {
vec![] vec![]
} }
}
fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> { impl<M: ?Sized + ModuleTrait> BaseModule for M {
vec![] fn single_name(&self) -> &'static str {
util::single_type_name::<Self>()
} }
} }

View file

@ -1,5 +1,10 @@
mod definition; mod definition;
pub use definition::ModuleTrait; pub use definition::{
BaseModule,
ModuleTrait,
};
pub(crate) mod all; pub(crate) mod all;
pub use all::register_module; pub use all::{
include_module,
};

View file

@ -13,14 +13,14 @@ static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| {
pub fn register_theme(theme: &'static dyn ThemeTrait) { pub fn register_theme(theme: &'static dyn ThemeTrait) {
let mut themes = THEMES.write().unwrap(); let mut themes = THEMES.write().unwrap();
if !themes.iter().any(|t| t.handler() == theme.handler()) { 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); 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( 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), Some(theme) => Some(*theme),
_ => None, _ => None,

View file

@ -5,12 +5,16 @@ use crate::api::component::{Assets, ComponentTrait, Favicon};
use crate::response::page::Page; use crate::response::page::Page;
use crate::base::component::Chunck; use crate::base::component::Chunck;
pub trait BaseTheme {
fn single_name(&self) -> &'static str;
}
/// Los temas deben implementar este "trait". /// Los temas deben implementar este "trait".
pub trait ThemeTrait: Send + Sync { pub trait ThemeTrait: BaseTheme + Send + Sync {
fn handler(&self) -> &'static str; fn handler(&self) -> &'static str;
fn name(&self) -> String { fn name(&self) -> String {
util::single_type_name::<Self>().to_owned() self.single_name().to_owned()
} }
fn description(&self) -> Option<String> { fn description(&self) -> Option<String> {
@ -130,3 +134,9 @@ pub trait ThemeTrait: Send + Sync {
.render() .render()
} }
} }
impl<T: ?Sized + ThemeTrait> BaseTheme for T {
fn single_name(&self) -> &'static str {
util::single_type_name::<Self>()
}
}

View file

@ -1,8 +1,11 @@
mod definition; mod definition;
pub use definition::ThemeTrait; pub use definition::{
BaseTheme,
ThemeTrait,
};
pub(crate) mod all; pub(crate) mod all;
pub use all::{ pub use all::{
register_theme, register_theme,
theme_by_name, theme_by_single_name,
}; };

View file

@ -40,7 +40,7 @@ impl Application {
// Registra el módulo de presentación de PageTop. // Registra el módulo de presentación de PageTop.
// Normalmente se sobrecargará en la función de inicio. // 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. // Registra las acciones de todos los módulos.
module::all::register_actions(); module::all::register_actions();