Modifica identificación de módulos y temas
This commit is contained in:
parent
3366a6acdc
commit
af9afca777
9 changed files with 49 additions and 21 deletions
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
};
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue