From a27097e2bd24369c3c47ec7af868bed8ee68d3e3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Wed, 3 Dec 2025 22:48:05 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20config.=20para=20activ?= =?UTF-8?q?ar=20p=C3=A1gina=20de=20bienvenida?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/extension/welcome.rs | 35 +++++++++++++++++++++++++++++------ src/config.rs | 9 +++++---- src/core/extension/all.rs | 6 ++++-- src/global.rs | 11 +++++++++-- 4 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index b875163b..d4a78547 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -1,10 +1,15 @@ use crate::prelude::*; -/// Página de bienvenida predeterminada de PageTop. +/// Página de bienvenida de PageTop. /// -/// Esta extensión se instala por defecto y muestra una página en la ruta raíz (`/`) cuando no se ha -/// configurado ninguna página de inicio personalizada. Permite confirmar que el servidor está -/// funcionando correctamente. +/// Esta extensión se instala por defecto si el ajuste de configuración [`global::App::welcome`] es +/// `true`. Muestra una página de bienvenida de PageTop en la ruta raíz (`/`) o en `/lang/{lang}`, +/// siempre que `{lang}` sea un idioma soportado (si no, devuelve una página de error 404). +/// +/// No obstante, cualquier extensión puede sobrescribir este comportamiento si utiliza estas mismas +/// rutas. +/// +/// Resulta útil en demos o para comprobar rápidamente que el servidor ha arrancado correctamente. pub struct Welcome; impl Extension for Welcome { @@ -17,15 +22,33 @@ impl Extension for Welcome { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - scfg.route("/", service::web::get().to(homepage)); + scfg.route("/", service::web::get().to(home_page)) + .route("/lang/{lang}", service::web::get().to(home_lang)); } } -async fn homepage(request: HttpRequest) -> ResultPage { +async fn home_page(request: HttpRequest) -> ResultPage { + let language = LangMatch::from_request(Some(&request)); + home(request, &language) +} + +async fn home_lang( + request: HttpRequest, + path: service::web::Path, +) -> ResultPage { + let language = LangMatch::resolve(path.into_inner()); + match language { + LangMatch::Found(_) => home(request, &language), + _ => Err(ErrorPage::NotFound(request)), + } +} + +fn home(request: HttpRequest, language: &impl LangId) -> ResultPage { let app = &global::SETTINGS.app.name; Page::new(request) .with_title(L10n::l("welcome_title")) + .with_langid(language) .add_child( Intro::new() .add_child( diff --git a/src/config.rs b/src/config.rs index 1607a874..32a73083 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,4 +1,4 @@ -//! Carga las opciones de configuración. +//! Carga las opciones de configuración de la aplicación. //! //! Estos ajustes se obtienen de archivos [TOML](https://toml.io) como pares `clave = valor` que se //! mapean a estructuras **fuertemente tipadas** y valores predefinidos. @@ -125,7 +125,7 @@ const DEFAULT_CONFIG_DIR: &str = "config"; // Modo de ejecución por defecto. const DEFAULT_RUN_MODE: &str = "default"; -/// Valores originales cargados desde los archivos de configuración como pares `clave = valor`. +/// Valores originales de los archivos de configuración como pares `clave = valor`. pub static CONFIG_VALUES: LazyLock> = LazyLock::new(|| { // CONFIG_DIR (si existe) o DEFAULT_CONFIG_DIR. Si no se puede resolver, se usa tal cual. let dir = env::var_os("CONFIG_DIR").unwrap_or_else(|| DEFAULT_CONFIG_DIR.into()); @@ -229,10 +229,11 @@ pub static CONFIG_VALUES: LazyLock> = LazyLock::new( macro_rules! include_config { ( $SETTINGS_NAME:ident : $Settings_Type:ty => [ $( $k:literal => $v:expr ),* $(,)? ] ) => { #[doc = concat!( - "Instancia los ajustes de configuración para [`", stringify!($Settings_Type), "`]." + "Ajustes de configuración y **valores por defecto** para ", + "[`", stringify!($Settings_Type), "`]." )] #[doc = ""] - #[doc = "Valores por defecto:"] + #[doc = "Valores predeterminados que se aplican en ausencia de configuración:"] #[doc = "```text"] $( #[doc = concat!($k, " = ", stringify!($v))] diff --git a/src/core/extension/all.rs b/src/core/extension/all.rs index fa67671d..b787c9a8 100644 --- a/src/core/extension/all.rs +++ b/src/core/extension/all.rs @@ -29,8 +29,10 @@ pub fn register_extensions(root_extension: Option) { add_to_enabled(&mut enabled_list, extension); } - // Añade la página de bienvenida por defecto a la lista de extensiones habilitadas. - add_to_enabled(&mut enabled_list, &crate::base::extension::Welcome); + // Añade la página de bienvenida predefinida si se habilita en la configuración. + if global::SETTINGS.app.welcome { + add_to_enabled(&mut enabled_list, &crate::base::extension::Welcome); + } // Guarda la lista final de extensiones habilitadas. ENABLED_EXTENSIONS.write().append(&mut enabled_list); diff --git a/src/global.rs b/src/global.rs index ee07d818..6726a3ef 100644 --- a/src/global.rs +++ b/src/global.rs @@ -11,6 +11,7 @@ include_config!(SETTINGS: Settings => [ "app.theme" => "Basic", "app.language" => "", "app.startup_banner" => "Slant", + "app.welcome" => true, // [dev] "dev.pagetop_static_dir" => "", @@ -59,13 +60,19 @@ pub struct App { /// Banner ASCII mostrado al inicio: *"Off"* (desactivado), *"Slant"*, *"Small"*, *"Speed"* o /// *"Starwars"*. pub startup_banner: String, + /// Activa la página de bienvenida de PageTop. + /// + /// Si está activada, se instala la extensión [`Welcome`](crate::base::extension::Welcome), que + /// ofrece una página de bienvenida predefinida en `"/"` y también en `"/lang/{lang}"`, para + /// mostrar el contenido en el idioma `{lang}`, siempre que esté soportado. + pub welcome: bool, /// Modo de ejecución, dado por la variable de entorno `PAGETOP_RUN_MODE`, o *"default"* si no /// está definido. pub run_mode: String, } #[derive(Debug, Deserialize)] -/// Sección `[Dev]` de la configuración. Forma parte de [`Settings`]. +/// Sección `[dev]` de la configuración. Forma parte de [`Settings`]. pub struct Dev { /// Directorio desde el que servir los archivos estáticos de PageTop. /// @@ -87,7 +94,7 @@ pub struct Log { /// *"Warn"*, *"Info"*, *"Debug"* o *"Trace"*. /// Ejemplo: "Error,actix_server::builder=Info,tracing_actix_web=Debug". pub tracing: String, - /// Muestra los mensajes de traza en el terminal (*"Stdout"*) o las registra en archivos con + /// Muestra los mensajes de traza en el terminal (*"Stdout"*) o los vuelca en archivos con /// rotación: *"Daily"*, *"Hourly"*, *"Minutely"* o *"Endless"*. pub rolling: String, /// Directorio para los archivos de traza (si `rolling` ≠ *"Stdout"*).