✨ Añade API para extensiones con funcionalidades
Añade el interfaz común que debe implementar cualquier extensión de PageTop para añadir nuevas funcionalidades a la aplicación en forma de servicios web y API de uso.
This commit is contained in:
parent
5d2f293942
commit
0df5f3f1c7
7 changed files with 436 additions and 2 deletions
77
src/core/extension/definition.rs
Normal file
77
src/core/extension/definition.rs
Normal file
|
@ -0,0 +1,77 @@
|
|||
use crate::core::AnyInfo;
|
||||
use crate::locale::L10n;
|
||||
use crate::service;
|
||||
|
||||
/// Representa una referencia a una extensión.
|
||||
///
|
||||
/// Las extensiones se definen como instancias estáticas globales para poder acceder a ellas desde
|
||||
/// cualquier hilo de la ejecución sin necesidad de sincronización adicional.
|
||||
pub type ExtensionRef = &'static dyn ExtensionTrait;
|
||||
|
||||
/// Interfaz común que debe implementar cualquier extensión de `PageTop`.
|
||||
///
|
||||
/// Este *trait* es fácil de implementar, basta con declarar la estructura de la extensión y
|
||||
/// sobreescribir los métodos que sea necesario.
|
||||
///
|
||||
/// ```rust
|
||||
/// use pagetop::prelude::*;
|
||||
///
|
||||
/// pub struct Blog;
|
||||
///
|
||||
/// impl ExtensionTrait for Blog {
|
||||
/// fn name(&self) -> L10n { L10n::n("Blog") }
|
||||
/// fn description(&self) -> L10n { L10n::n("Sistema de blogs") }
|
||||
/// }
|
||||
/// ```
|
||||
pub trait ExtensionTrait: AnyInfo + Send + Sync {
|
||||
/// Nombre legible para el usuario.
|
||||
///
|
||||
/// Predeterminado por el [`short_name`](AnyInfo::short_name) del tipo asociado a la extensión.
|
||||
fn name(&self) -> L10n {
|
||||
L10n::n(self.short_name())
|
||||
}
|
||||
|
||||
/// Descripción corta para paneles, listados, etc.
|
||||
fn description(&self) -> L10n {
|
||||
L10n::default()
|
||||
}
|
||||
|
||||
/// Otras extensiones que deben habilitarse **antes** de esta.
|
||||
///
|
||||
/// `PageTop` las resolverá automáticamente respetando el orden durante el arranque de la
|
||||
/// aplicación.
|
||||
fn dependencies(&self) -> Vec<ExtensionRef> {
|
||||
vec![]
|
||||
}
|
||||
|
||||
/// Inicializa la extensión durante la lógica de arranque de la aplicación.
|
||||
///
|
||||
/// Se llama una sola vez, después de que todas las dependencias se han inicializado y antes de
|
||||
/// aceptar cualquier petición HTTP.
|
||||
fn initialize(&self) {}
|
||||
|
||||
/// Configura los servicios web de la extensión, como rutas, *middleware*, acceso a ficheros
|
||||
/// estáticos, etc., usando [`ServiceConfig`](crate::service::web::ServiceConfig).
|
||||
///
|
||||
/// ```rust,ignore
|
||||
/// use pagetop::prelude::*;
|
||||
///
|
||||
/// pub struct ExtensionSample;
|
||||
///
|
||||
/// impl ExtensionTrait for ExtensionSample {
|
||||
/// fn configure_service(&self, scfg: &mut service::web::ServiceConfig) {
|
||||
/// scfg.route("/sample", web::get().to(route_sample));
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
#[allow(unused_variables)]
|
||||
fn configure_service(&self, scfg: &mut service::web::ServiceConfig) {}
|
||||
|
||||
/// Permite crear extensiones para deshabilitar y desinstalar los recursos de otras extensiones
|
||||
/// utilizadas en versiones anteriores de la aplicación.
|
||||
///
|
||||
/// Actualmente no se usa, pero se deja como *placeholder* para futuras implementaciones.
|
||||
fn drop_extensions(&self) -> Vec<ExtensionRef> {
|
||||
vec![]
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue