diff --git a/pagetop/config/settings.predefined.toml b/pagetop/config/settings.predefined.toml index 115b4cb7..19db0a27 100644 --- a/pagetop/config/settings.predefined.toml +++ b/pagetop/config/settings.predefined.toml @@ -10,19 +10,6 @@ direction = "ltr" # Rótulo al inicio: "Off", "Slant", "Small", "Speed" o "Starwars". startup_banner = "Slant" -[log] -# Traza de ejecución: "Error", "Warn", "Info", "Debug" o "Trace". -# Ejemplos: "Error,actix_server::builder=Info,tracing_actix_web=Debug". -tracing = "Info" -# En terminal ("Stdout") o archivos "Daily", "Hourly", "Minutely" o "Endless". -rolling = "Stdout" -# Directorio para los archivos de traza (si rolling != "Stdout"). -path = "log" -# Prefijo para los archivos de traza (si rolling != "Stdout"). -prefix = "tracing.log" -# Presentación de las trazas: "Full", "Compact", "Pretty" o "Json". -format = "Full" - [database] # Conecta con una base de datos (opcional). # Tipo de base de datos (mysql, postgres ó sqlite). @@ -39,11 +26,6 @@ db_port = 0 # Número máximo de conexiones habilitadas. max_pool_size = 5 -[webserver] -# Configuración del servidor web. -bind_address = "localhost" -bind_port = 8088 - [dev] # Los archivos estáticos requeridos por temas y componentes incluidos en PageTop # se integran de manera predeterminada en el binario ejecutable. Sin embargo, es @@ -51,3 +33,21 @@ bind_port = 8088 # que no requiere compilar cada vez que se modifican. En este caso, normalmente, # basta con indicar el directorio "pagetop/static". static_files = "" + +[log] +# Traza de ejecución: "Error", "Warn", "Info", "Debug" o "Trace". +# Ejemplos: "Error,actix_server::builder=Info,tracing_actix_web=Debug". +tracing = "Info" +# En terminal ("Stdout") o archivos "Daily", "Hourly", "Minutely" o "Endless". +rolling = "Stdout" +# Directorio para los archivos de traza (si rolling != "Stdout"). +path = "log" +# Prefijo para los archivos de traza (si rolling != "Stdout"). +prefix = "tracing.log" +# Presentación de las trazas: "Full", "Compact", "Pretty" o "Json". +format = "Full" + +[server] +# Configuración del servidor web. +bind_address = "localhost" +bind_port = 8088 diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 931a71e9..cb5a3f79 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -4,7 +4,7 @@ pub use actix_web::{ pub use actix_web_files::Files as ActixFiles; pub use actix_web_static_files::ResourceFiles; -mod config; +pub mod config; pub use config::SETTINGS; mod banner; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 5c20228d..a889822e 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -53,10 +53,7 @@ impl Application { .configure(&theme::all::configure_services) .default_service(super::web::route().to(service_not_found)) }) - .bind(format!( - "{}:{}", - &SETTINGS.webserver.bind_address, &SETTINGS.webserver.bind_port - ))? + .bind(format!("{}:{}", &SETTINGS.server.bind_address, &SETTINGS.server.bind_port))? .run(); Ok(Self { server }) diff --git a/pagetop/src/app/config.rs b/pagetop/src/app/config.rs index f7ba57b7..37c50815 100644 --- a/pagetop/src/app/config.rs +++ b/pagetop/src/app/config.rs @@ -1,3 +1,5 @@ +//! Ajustes globales de la configuración. + use crate::config; use crate::predefined_settings; use crate::LazyStatic; @@ -5,14 +7,14 @@ use crate::LazyStatic; use serde::Deserialize; #[derive(Debug, Deserialize)] -/// Ajustes globales para las secciones [`[app]`](App), [`[log]`](Log), [`[database]`](Database), -/// [`[webserver]`](Webserver) y [`[dev]`](Dev) reservadas para PageTop ([`SETTINGS`]). +/// Ajustes globales para las secciones reservadas [`[app]`](App), [`[database]`](Database), +/// [`[dev]`](Dev), [`[log]`](Log) y [`[server]`](Server) (ver [`SETTINGS`]). pub struct Settings { pub app: App, - pub log: Log, pub database: Database, - pub webserver: Webserver, pub dev: Dev, + pub log: Log, + pub server: Server, } #[derive(Debug, Deserialize)] @@ -36,23 +38,6 @@ pub struct App { pub run_mode: String, } -#[derive(Debug, Deserialize)] -/// Sección `[log]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Log { - /// Valor predefinido: *"Info"* - pub tracing: String, - /// Valor predefinido: *"Stdout"* - pub rolling: String, - /// Valor predefinido: *"log"* - pub path: String, - /// Valor predefinido: *"tracing.log"* - pub prefix: String, - /// Valor predefinido: *"Full"* - pub format: String, -} - #[derive(Debug, Deserialize)] /// Sección `[database]` de los ajustes globales. /// @@ -74,17 +59,6 @@ pub struct Database { pub max_pool_size: u32, } -#[derive(Debug, Deserialize)] -/// Sección `[webserver]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Webserver { - /// Valor predefinido: *"localhost"* - pub bind_address: String, - /// Valor predefinido: *"8088"* - pub bind_port: u16, -} - #[derive(Debug, Deserialize)] /// Sección `[dev]` de los ajustes globales. /// @@ -94,9 +68,45 @@ pub struct Dev { pub static_files: String, } -/// Declara los ajustes globales para la estructura [`Settings`]. +#[derive(Debug, Deserialize)] +/// Sección `[log]` de los ajustes globales. /// -/// Ver [`Cómo usar los ajustes globales de la configuración`](index.html#cómo-usar-los-ajustes-globales-de-la-configuración). +/// Ver [`Settings`]. +pub struct Log { + /// Valor predefinido: *"Info"* + pub tracing: String, + /// Valor predefinido: *"Stdout"* + pub rolling: String, + /// Valor predefinido: *"log"* + pub path: String, + /// Valor predefinido: *"tracing.log"* + pub prefix: String, + /// Valor predefinido: *"Full"* + pub format: String, +} + +#[derive(Debug, Deserialize)] +/// Sección `[server]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct Server { + /// Valor predefinido: *"localhost"* + pub bind_address: String, + /// Valor predefinido: *"8088"* + pub bind_port: u16, +} + +/// Declara e inicializa los ajustes globales para la estructura [`Settings`]. +/// +/// ``` +/// use pagetop::prelude::*; +/// +/// fn demo() { +/// println!("App name: {}", &SETTINGS.app.name); +/// println!("App description: {}", &SETTINGS.app.description); +/// println!("Value of PAGETOP_RUN_MODE: {}", &SETTINGS.app.run_mode); +/// } +/// ``` pub static SETTINGS: LazyStatic = LazyStatic::new(|| { config::try_into::(predefined_settings!( // [app] @@ -107,13 +117,6 @@ pub static SETTINGS: LazyStatic = LazyStatic::new(|| { "app.direction" => "ltr", "app.startup_banner" => "Slant", - // [log] - "log.tracing" => "Info", - "log.rolling" => "Stdout", - "log.path" => "log", - "log.prefix" => "tracing.log", - "log.format" => "Full", - // [database] "database.db_type" => "", "database.db_name" => "", @@ -123,11 +126,18 @@ pub static SETTINGS: LazyStatic = LazyStatic::new(|| { "database.db_port" => "0", "database.max_pool_size" => "5", - // [webserver] - "webserver.bind_address" => "localhost", - "webserver.bind_port" => "8088", - // [dev] - "dev.static_files" => "" + "dev.static_files" => "", + + // [log] + "log.tracing" => "Info", + "log.rolling" => "Stdout", + "log.path" => "log", + "log.prefix" => "tracing.log", + "log.format" => "Full", + + // [server] + "server.bind_address" => "localhost", + "server.bind_port" => "8088" )) }); diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index e75ee7d7..1f077384 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -39,25 +39,6 @@ //! 3. **config/local.toml**, para añadir o sobrescribir ajustes de los archivos anteriores. //! //! -//! # Cómo usar los ajustes globales de la configuración -//! -//! PageTop incluye un conjunto de ajustes propios ([`Settings`]) accesibles vía [`SETTINGS`] para -//! las secciones reservadas [`[app]`](App), [`[log]`](Log), [`[database]`](Database), -//! [`[webserver]`](Webserver) y [`[dev]`](Dev) de la configuración: -//! -//! ``` -//! use pagetop::prelude::*; -//! -//! fn demo() { -//! println!("App name: {}", &SETTINGS.app.name); -//! println!("App description: {}", &SETTINGS.app.description); -//! println!("Value of PAGETOP_RUN_MODE: {}", &SETTINGS.app.run_mode); -//! } -//! ``` -//! -//! Los ajustes de configuración siempre son de sólo lectura. -//! -//! //! # Cómo añadir ajustes de configuración //! //! Para proporcionar a tu **aplicación** o **módulo** sus propios ajustes de configuración, añade @@ -68,9 +49,9 @@ //! serde = { version = "1.0", features = ["derive"] } //! ``` //! -//! Incluye en tu código una asignación similar a la que usa [`SETTINGS`] para declarar -//! ([`LazyStatic`]) e inicializar tus nuevos ajustes ([`try_into()`]) con tipos seguros y -//! valores predefinidos ([`predefined_settings!`](crate::predefined_settings)): +//! Declara ([`LazyStatic`]) e inicializa tus nuevos ajustes con tipos seguros +//! ([`config::try_into()`](try_into)) y valores predefinidos +//! ([`predefined_settings!`](crate::predefined_settings)): //! //! ``` //! use pagetop::prelude::*; @@ -99,14 +80,20 @@ //! }); //! ``` //! -//! Y usa la sintaxis TOML para añadir tu nueva sección `[myapp]` en los archivos de configuración, -//! del mismo modo que `[app]` o `[webserver]` hacen para los ajustes globales ([`Settings`]). +//! De hecho, así se declaran e inicializan los ajustes globales de la configuración +//! ([`SETTINGS`](crate::app::config::SETTINGS)). +//! +//! Usa la sintaxis TOML para añadir tu nueva sección `[myapp]` en los archivos de configuración, +//! del mismo modo que `[log]` o `[server]` hacen para los ajustes globales +//! ([`Settings`](crate::app::config::Settings)). //! //! Se recomienda inicializar todos los ajustes con valores predefinidos, o utilizar la notación //! `Option` si van a ser tratados en el código como opcionales. //! +//! Los ajustes de configuración siempre son de sólo lectura. //! -//! # Cómo usar los nuevos ajustes de configuración +//! +//! # Cómo usar tus nuevos ajustes de configuración //! //! ``` //! fn demo() { @@ -185,13 +172,14 @@ static CONFIG_DATA: LazyStatic = LazyStatic::new(|| { settings }); -/// Carga ajustes con tipos seguros y valores predefinidos para tu aplicación o módulo en una -/// estructura similiar a [`SETTINGS`]. +/// Carga ajustes con tipos seguros y valores predefinidos para tu aplicación o módulo. +/// +/// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. /// /// Ver [`Cómo añadir ajustes de configuración`](index.html#cómo-añadir-ajustes-de-configuración). -pub fn try_into(values: PredefinedSettings) -> T +pub fn try_into(values: PredefinedSettings) -> S where - T: Deserialize<'static>, + S: Deserialize<'static>, { let mut settings = CONFIG_DATA.clone(); for (key, value) in values.iter() {