Compare commits
3 commits
4944af073f
...
a27097e2bd
| Author | SHA1 | Date | |
|---|---|---|---|
| a27097e2bd | |||
| 7083413d7b | |||
| 51e18cf5ee |
10 changed files with 99 additions and 42 deletions
|
|
@ -10,10 +10,7 @@ impl Extension for SuperMenu {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn initialize(&self) {
|
fn initialize(&self) {
|
||||||
let home_path = |cx: &Context| match cx.langid().language.as_str() {
|
let home_path = |cx: &Context| join!("/lang/", cx.langid().language.as_str()).into();
|
||||||
"en" => "/en",
|
|
||||||
_ => "/",
|
|
||||||
};
|
|
||||||
|
|
||||||
let navbar_menu = Navbar::brand_left(navbar::Brand::new().with_path(Some(home_path)))
|
let navbar_menu = Navbar::brand_left(navbar::Brand::new().with_path(Some(home_path)))
|
||||||
.with_expand(BreakPoint::LG)
|
.with_expand(BreakPoint::LG)
|
||||||
|
|
@ -25,7 +22,7 @@ impl Extension for SuperMenu {
|
||||||
))
|
))
|
||||||
.add_item(nav::Item::link_blank(
|
.add_item(nav::Item::link_blank(
|
||||||
L10n::l("sample_menus_item_blank"),
|
L10n::l("sample_menus_item_blank"),
|
||||||
|_| "https://docs.rs/pagetop",
|
|_| "https://docs.rs/pagetop".into(),
|
||||||
))
|
))
|
||||||
.add_item(nav::Item::dropdown(
|
.add_item(nav::Item::dropdown(
|
||||||
Dropdown::new()
|
Dropdown::new()
|
||||||
|
|
@ -33,28 +30,28 @@ impl Extension for SuperMenu {
|
||||||
.add_item(dropdown::Item::header(L10n::l("sample_menus_dev_header")))
|
.add_item(dropdown::Item::header(L10n::l("sample_menus_dev_header")))
|
||||||
.add_item(dropdown::Item::link(
|
.add_item(dropdown::Item::link(
|
||||||
L10n::l("sample_menus_dev_getting_started"),
|
L10n::l("sample_menus_dev_getting_started"),
|
||||||
|_| "/dev/getting-started",
|
|_| "/dev/getting-started".into(),
|
||||||
))
|
))
|
||||||
.add_item(dropdown::Item::link(
|
.add_item(dropdown::Item::link(
|
||||||
L10n::l("sample_menus_dev_guides"),
|
L10n::l("sample_menus_dev_guides"),
|
||||||
|_| "/dev/guides",
|
|_| "/dev/guides".into(),
|
||||||
))
|
))
|
||||||
.add_item(dropdown::Item::link_blank(
|
.add_item(dropdown::Item::link_blank(
|
||||||
L10n::l("sample_menus_dev_forum"),
|
L10n::l("sample_menus_dev_forum"),
|
||||||
|_| "https://forum.example.dev",
|
|_| "https://forum.example.dev".into(),
|
||||||
))
|
))
|
||||||
.add_item(dropdown::Item::divider())
|
.add_item(dropdown::Item::divider())
|
||||||
.add_item(dropdown::Item::header(L10n::l("sample_menus_sdk_header")))
|
.add_item(dropdown::Item::header(L10n::l("sample_menus_sdk_header")))
|
||||||
.add_item(dropdown::Item::link(
|
.add_item(dropdown::Item::link(
|
||||||
L10n::l("sample_menus_sdk_rust"),
|
L10n::l("sample_menus_sdk_rust"),
|
||||||
|_| "/dev/sdks/rust",
|
|_| "/dev/sdks/rust".into(),
|
||||||
))
|
))
|
||||||
.add_item(dropdown::Item::link(L10n::l("sample_menus_sdk_js"), |_| {
|
.add_item(dropdown::Item::link(L10n::l("sample_menus_sdk_js"), |_| {
|
||||||
"/dev/sdks/js"
|
"/dev/sdks/js".into()
|
||||||
}))
|
}))
|
||||||
.add_item(dropdown::Item::link(
|
.add_item(dropdown::Item::link(
|
||||||
L10n::l("sample_menus_sdk_python"),
|
L10n::l("sample_menus_sdk_python"),
|
||||||
|_| "/dev/sdks/python",
|
|_| "/dev/sdks/python".into(),
|
||||||
))
|
))
|
||||||
.add_item(dropdown::Item::divider())
|
.add_item(dropdown::Item::divider())
|
||||||
.add_item(dropdown::Item::header(L10n::l(
|
.add_item(dropdown::Item::header(L10n::l(
|
||||||
|
|
@ -62,22 +59,22 @@ impl Extension for SuperMenu {
|
||||||
)))
|
)))
|
||||||
.add_item(dropdown::Item::link(
|
.add_item(dropdown::Item::link(
|
||||||
L10n::l("sample_menus_plugin_auth"),
|
L10n::l("sample_menus_plugin_auth"),
|
||||||
|_| "/dev/sdks/rust/plugins/auth",
|
|_| "/dev/sdks/rust/plugins/auth".into(),
|
||||||
))
|
))
|
||||||
.add_item(dropdown::Item::link(
|
.add_item(dropdown::Item::link(
|
||||||
L10n::l("sample_menus_plugin_cache"),
|
L10n::l("sample_menus_plugin_cache"),
|
||||||
|_| "/dev/sdks/rust/plugins/cache",
|
|_| "/dev/sdks/rust/plugins/cache".into(),
|
||||||
))
|
))
|
||||||
.add_item(dropdown::Item::divider())
|
.add_item(dropdown::Item::divider())
|
||||||
.add_item(dropdown::Item::label(L10n::l("sample_menus_item_label")))
|
.add_item(dropdown::Item::label(L10n::l("sample_menus_item_label")))
|
||||||
.add_item(dropdown::Item::link_disabled(
|
.add_item(dropdown::Item::link_disabled(
|
||||||
L10n::l("sample_menus_item_disabled"),
|
L10n::l("sample_menus_item_disabled"),
|
||||||
|_| "#",
|
|_| "#".into(),
|
||||||
)),
|
)),
|
||||||
))
|
))
|
||||||
.add_item(nav::Item::link_disabled(
|
.add_item(nav::Item::link_disabled(
|
||||||
L10n::l("sample_menus_item_disabled"),
|
L10n::l("sample_menus_item_disabled"),
|
||||||
|_| "#",
|
|_| "#".into(),
|
||||||
)),
|
)),
|
||||||
))
|
))
|
||||||
.add_item(navbar::Item::nav(
|
.add_item(navbar::Item::nav(
|
||||||
|
|
@ -88,10 +85,10 @@ impl Extension for SuperMenu {
|
||||||
)
|
)
|
||||||
.add_item(nav::Item::link(
|
.add_item(nav::Item::link(
|
||||||
L10n::l("sample_menus_item_sign_up"),
|
L10n::l("sample_menus_item_sign_up"),
|
||||||
|_| "/auth/sign-up",
|
|_| "/auth/sign-up".into(),
|
||||||
))
|
))
|
||||||
.add_item(nav::Item::link(L10n::l("sample_menus_item_login"), |_| {
|
.add_item(nav::Item::link(L10n::l("sample_menus_item_login"), |_| {
|
||||||
"/auth/login"
|
"/auth/login".into()
|
||||||
})),
|
})),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ impl Component for Item {
|
||||||
} => {
|
} => {
|
||||||
let path = path(cx);
|
let path = path(cx);
|
||||||
let current_path = cx.request().map(|request| request.path());
|
let current_path = cx.request().map(|request| request.path());
|
||||||
let is_current = !*disabled && (current_path == Some(path));
|
let is_current = !*disabled && (current_path == Some(&path));
|
||||||
|
|
||||||
let mut classes = "dropdown-item".to_string();
|
let mut classes = "dropdown-item".to_string();
|
||||||
if is_current {
|
if is_current {
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,9 @@ pub enum ItemKind {
|
||||||
blank: bool,
|
blank: bool,
|
||||||
disabled: bool,
|
disabled: bool,
|
||||||
},
|
},
|
||||||
|
/// Contenido HTML arbitrario. El componente [`Html`] se renderiza tal cual como elemento del
|
||||||
|
/// menú, sin añadir ningún comportamiento de navegación adicional.
|
||||||
|
Html(Typed<Html>),
|
||||||
/// Elemento que despliega un menú [`Dropdown`].
|
/// Elemento que despliega un menú [`Dropdown`].
|
||||||
Dropdown(Typed<Dropdown>),
|
Dropdown(Typed<Dropdown>),
|
||||||
}
|
}
|
||||||
|
|
@ -115,7 +118,7 @@ impl Component for Item {
|
||||||
} => {
|
} => {
|
||||||
let path = path(cx);
|
let path = path(cx);
|
||||||
let current_path = cx.request().map(|request| request.path());
|
let current_path = cx.request().map(|request| request.path());
|
||||||
let is_current = !*disabled && (current_path == Some(path));
|
let is_current = !*disabled && (current_path == Some(&path));
|
||||||
|
|
||||||
let mut classes = "nav-link".to_string();
|
let mut classes = "nav-link".to_string();
|
||||||
if is_current {
|
if is_current {
|
||||||
|
|
@ -148,6 +151,12 @@ impl Component for Item {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ItemKind::Html(html) => PrepareMarkup::With(html! {
|
||||||
|
li id=[self.id()] class=[self.classes().get()] {
|
||||||
|
(html.render(cx))
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
|
||||||
ItemKind::Dropdown(menu) => {
|
ItemKind::Dropdown(menu) => {
|
||||||
if let Some(dd) = menu.borrow() {
|
if let Some(dd) = menu.borrow() {
|
||||||
let items = dd.items().render(cx);
|
let items = dd.items().render(cx);
|
||||||
|
|
@ -244,6 +253,17 @@ impl Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Crea un elemento con contenido HTML arbitrario.
|
||||||
|
///
|
||||||
|
/// El contenido se renderiza tal cual lo devuelve el componente [`Html`], dentro de un `<li>`
|
||||||
|
/// con las clases de navegación asociadas a [`Item`].
|
||||||
|
pub fn html(html: Html) -> Self {
|
||||||
|
Item {
|
||||||
|
item_kind: ItemKind::Html(Typed::with(html)),
|
||||||
|
..Default::default()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Crea un elemento de navegación que contiene un menú desplegable [`Dropdown`].
|
/// Crea un elemento de navegación que contiene un menú desplegable [`Dropdown`].
|
||||||
///
|
///
|
||||||
/// Sólo se tienen en cuenta **el título** (si no existe le asigna uno por defecto) y **la lista
|
/// Sólo se tienen en cuenta **el título** (si no existe le asigna uno por defecto) y **la lista
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ pub struct Brand {
|
||||||
/// Devuelve el eslogan de la marca.
|
/// Devuelve el eslogan de la marca.
|
||||||
slogan: L10n,
|
slogan: L10n,
|
||||||
/// Devuelve la función que resuelve la URL asociada a la marca (si existe).
|
/// Devuelve la función que resuelve la URL asociada a la marca (si existe).
|
||||||
#[default(_code = "Some(|_| \"/\")")]
|
#[default(_code = "Some(|_| \"/\".into())")]
|
||||||
path: Option<FnPathByContext>,
|
path: Option<FnPathByContext>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -91,13 +91,14 @@ pub struct Intro {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Intro {
|
impl Default for Intro {
|
||||||
#[rustfmt::skip]
|
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
|
const BUTTON_LINK: &str = "https://pagetop.cillero.es";
|
||||||
|
|
||||||
Intro {
|
Intro {
|
||||||
title : L10n::l("intro_default_title"),
|
title: L10n::l("intro_default_title"),
|
||||||
slogan : L10n::l("intro_default_slogan").with_arg("app", &global::SETTINGS.app.name),
|
slogan: L10n::l("intro_default_slogan").with_arg("app", &global::SETTINGS.app.name),
|
||||||
button : Some((L10n::l("intro_default_button"), |_| "https://pagetop.cillero.es")),
|
button: Some((L10n::l("intro_default_button"), |_| BUTTON_LINK.into())),
|
||||||
opening : IntroOpening::default(),
|
opening: IntroOpening::default(),
|
||||||
children: Children::default(),
|
children: Children::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,15 @@
|
||||||
use crate::prelude::*;
|
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
|
/// Esta extensión se instala por defecto si el ajuste de configuración [`global::App::welcome`] es
|
||||||
/// configurado ninguna página de inicio personalizada. Permite confirmar que el servidor está
|
/// `true`. Muestra una página de bienvenida de PageTop en la ruta raíz (`/`) o en `/lang/{lang}`,
|
||||||
/// funcionando correctamente.
|
/// 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;
|
pub struct Welcome;
|
||||||
|
|
||||||
impl Extension for Welcome {
|
impl Extension for Welcome {
|
||||||
|
|
@ -17,15 +22,33 @@ impl Extension for Welcome {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn configure_service(&self, scfg: &mut service::web::ServiceConfig) {
|
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<Markup, ErrorPage> {
|
async fn home_page(request: HttpRequest) -> ResultPage<Markup, ErrorPage> {
|
||||||
|
let language = LangMatch::from_request(Some(&request));
|
||||||
|
home(request, &language)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn home_lang(
|
||||||
|
request: HttpRequest,
|
||||||
|
path: service::web::Path<String>,
|
||||||
|
) -> ResultPage<Markup, ErrorPage> {
|
||||||
|
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<Markup, ErrorPage> {
|
||||||
let app = &global::SETTINGS.app.name;
|
let app = &global::SETTINGS.app.name;
|
||||||
|
|
||||||
Page::new(request)
|
Page::new(request)
|
||||||
.with_title(L10n::l("welcome_title"))
|
.with_title(L10n::l("welcome_title"))
|
||||||
|
.with_langid(language)
|
||||||
.add_child(
|
.add_child(
|
||||||
Intro::new()
|
Intro::new()
|
||||||
.add_child(
|
.add_child(
|
||||||
|
|
|
||||||
|
|
@ -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
|
//! Estos ajustes se obtienen de archivos [TOML](https://toml.io) como pares `clave = valor` que se
|
||||||
//! mapean a estructuras **fuertemente tipadas** y valores predefinidos.
|
//! mapean a estructuras **fuertemente tipadas** y valores predefinidos.
|
||||||
|
|
@ -125,7 +125,7 @@ const DEFAULT_CONFIG_DIR: &str = "config";
|
||||||
// Modo de ejecución por defecto.
|
// Modo de ejecución por defecto.
|
||||||
const DEFAULT_RUN_MODE: &str = "default";
|
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<ConfigBuilder<DefaultState>> = LazyLock::new(|| {
|
pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new(|| {
|
||||||
// CONFIG_DIR (si existe) o DEFAULT_CONFIG_DIR. Si no se puede resolver, se usa tal cual.
|
// 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());
|
let dir = env::var_os("CONFIG_DIR").unwrap_or_else(|| DEFAULT_CONFIG_DIR.into());
|
||||||
|
|
@ -229,10 +229,11 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new(
|
||||||
macro_rules! include_config {
|
macro_rules! include_config {
|
||||||
( $SETTINGS_NAME:ident : $Settings_Type:ty => [ $( $k:literal => $v:expr ),* $(,)? ] ) => {
|
( $SETTINGS_NAME:ident : $Settings_Type:ty => [ $( $k:literal => $v:expr ),* $(,)? ] ) => {
|
||||||
#[doc = concat!(
|
#[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 = ""]
|
||||||
#[doc = "Valores por defecto:"]
|
#[doc = "Valores predeterminados que se aplican en ausencia de configuración:"]
|
||||||
#[doc = "```text"]
|
#[doc = "```text"]
|
||||||
$(
|
$(
|
||||||
#[doc = concat!($k, " = ", stringify!($v))]
|
#[doc = concat!($k, " = ", stringify!($v))]
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
//! API para construir nuevos componentes.
|
//! API para construir nuevos componentes.
|
||||||
|
|
||||||
|
use std::borrow::Cow;
|
||||||
|
|
||||||
mod definition;
|
mod definition;
|
||||||
pub use definition::{Component, ComponentRender};
|
pub use definition::{Component, ComponentRender};
|
||||||
|
|
||||||
|
|
@ -66,6 +68,10 @@ pub type FnIsRenderable = fn(cx: &Context) -> bool;
|
||||||
|
|
||||||
/// Alias de función (*callback*) para **resolver una URL** según el contexto de renderizado.
|
/// Alias de función (*callback*) para **resolver una URL** según el contexto de renderizado.
|
||||||
///
|
///
|
||||||
/// Se usa para generar enlaces dinámicos en función del contexto (petición, idioma, etc.). Debe
|
/// Se usa para generar enlaces dinámicos en función del contexto (petición, idioma, etc.). El
|
||||||
/// devolver una referencia válida durante el renderizado.
|
/// resultado se devuelve como [`Cow<'static, str>`](std::borrow::Cow), lo que permite:
|
||||||
pub type FnPathByContext = fn(cx: &Context) -> &str;
|
///
|
||||||
|
/// - Usar rutas estáticas sin asignaciones adicionales (`"/path".into()`).
|
||||||
|
/// - Construir rutas dinámicas en tiempo de ejecución (`format!(...).into()`), por ejemplo, en
|
||||||
|
/// función de parámetros almacenados en [`Context`].
|
||||||
|
pub type FnPathByContext = fn(cx: &Context) -> Cow<'static, str>;
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,10 @@ pub fn register_extensions(root_extension: Option<ExtensionRef>) {
|
||||||
add_to_enabled(&mut enabled_list, extension);
|
add_to_enabled(&mut enabled_list, extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Añade la página de bienvenida por defecto a la lista de extensiones habilitadas.
|
// Añade la página de bienvenida predefinida si se habilita en la configuración.
|
||||||
add_to_enabled(&mut enabled_list, &crate::base::extension::Welcome);
|
if global::SETTINGS.app.welcome {
|
||||||
|
add_to_enabled(&mut enabled_list, &crate::base::extension::Welcome);
|
||||||
|
}
|
||||||
|
|
||||||
// Guarda la lista final de extensiones habilitadas.
|
// Guarda la lista final de extensiones habilitadas.
|
||||||
ENABLED_EXTENSIONS.write().append(&mut enabled_list);
|
ENABLED_EXTENSIONS.write().append(&mut enabled_list);
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ include_config!(SETTINGS: Settings => [
|
||||||
"app.theme" => "Basic",
|
"app.theme" => "Basic",
|
||||||
"app.language" => "",
|
"app.language" => "",
|
||||||
"app.startup_banner" => "Slant",
|
"app.startup_banner" => "Slant",
|
||||||
|
"app.welcome" => true,
|
||||||
|
|
||||||
// [dev]
|
// [dev]
|
||||||
"dev.pagetop_static_dir" => "",
|
"dev.pagetop_static_dir" => "",
|
||||||
|
|
@ -59,13 +60,19 @@ pub struct App {
|
||||||
/// Banner ASCII mostrado al inicio: *"Off"* (desactivado), *"Slant"*, *"Small"*, *"Speed"* o
|
/// Banner ASCII mostrado al inicio: *"Off"* (desactivado), *"Slant"*, *"Small"*, *"Speed"* o
|
||||||
/// *"Starwars"*.
|
/// *"Starwars"*.
|
||||||
pub startup_banner: String,
|
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
|
/// Modo de ejecución, dado por la variable de entorno `PAGETOP_RUN_MODE`, o *"default"* si no
|
||||||
/// está definido.
|
/// está definido.
|
||||||
pub run_mode: String,
|
pub run_mode: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[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 {
|
pub struct Dev {
|
||||||
/// Directorio desde el que servir los archivos estáticos de PageTop.
|
/// Directorio desde el que servir los archivos estáticos de PageTop.
|
||||||
///
|
///
|
||||||
|
|
@ -87,7 +94,7 @@ pub struct Log {
|
||||||
/// *"Warn"*, *"Info"*, *"Debug"* o *"Trace"*.
|
/// *"Warn"*, *"Info"*, *"Debug"* o *"Trace"*.
|
||||||
/// Ejemplo: "Error,actix_server::builder=Info,tracing_actix_web=Debug".
|
/// Ejemplo: "Error,actix_server::builder=Info,tracing_actix_web=Debug".
|
||||||
pub tracing: String,
|
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"*.
|
/// rotación: *"Daily"*, *"Hourly"*, *"Minutely"* o *"Endless"*.
|
||||||
pub rolling: String,
|
pub rolling: String,
|
||||||
/// Directorio para los archivos de traza (si `rolling` ≠ *"Stdout"*).
|
/// Directorio para los archivos de traza (si `rolling` ≠ *"Stdout"*).
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue