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::*;
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]

View file

@ -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
}

View file

@ -10,7 +10,7 @@ static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = 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();

View file

@ -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::<Self>().to_owned()
self.single_name().to_owned()
}
fn description(&self) -> Option<String> {
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<MigrationItem> {
vec![]
}
}
fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> {
vec![]
impl<M: ?Sized + ModuleTrait> BaseModule for M {
fn single_name(&self) -> &'static str {
util::single_type_name::<Self>()
}
}

View file

@ -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,
};

View file

@ -13,14 +13,14 @@ static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = 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,

View file

@ -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::<Self>().to_owned()
self.single_name().to_owned()
}
fn description(&self) -> Option<String> {
@ -130,3 +134,9 @@ pub trait ThemeTrait: Send + Sync {
.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;
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,
};

View file

@ -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();