create state module
This commit is contained in:
parent
87dd6ee7fb
commit
20d95079b5
2 changed files with 84 additions and 78 deletions
83
src/main.rs
83
src/main.rs
|
@ -1,21 +1,10 @@
|
|||
#![warn(clippy::pedantic)]
|
||||
use std::{collections::HashMap, path::Path, sync::Arc};
|
||||
|
||||
use axum::http::Uri;
|
||||
|
||||
use anyhow::Result;
|
||||
use notify::Watcher;
|
||||
use page::Page;
|
||||
|
||||
use settings::Settings;
|
||||
use tag::Tag;
|
||||
use tera::Tera;
|
||||
|
||||
use time::OffsetDateTime;
|
||||
use std::{path::Path, sync::Arc};
|
||||
use tokio::{net::TcpListener, signal, sync::RwLock};
|
||||
use tower_http::{compression::CompressionLayer, cors::CorsLayer, trace::TraceLayer};
|
||||
use tracing::{debug, error, instrument, log::info};
|
||||
|
||||
use anyhow::Result;
|
||||
use tracing_subscriber::EnvFilter;
|
||||
|
||||
mod error;
|
||||
|
@ -26,63 +15,11 @@ mod hilighting;
|
|||
mod markdown;
|
||||
mod page;
|
||||
mod settings;
|
||||
mod state;
|
||||
mod tag;
|
||||
|
||||
pub struct AppState {
|
||||
startup_time: OffsetDateTime,
|
||||
base_url: Uri,
|
||||
pages: HashMap<String, Page>,
|
||||
aliases: HashMap<String, String>,
|
||||
settings: Settings,
|
||||
tags: HashMap<String, Tag>,
|
||||
tera: Tera,
|
||||
}
|
||||
|
||||
impl Default for AppState {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
startup_time: OffsetDateTime::now_utc(),
|
||||
base_url: Uri::default(),
|
||||
tera: Tera::default(),
|
||||
settings: Settings::default(),
|
||||
aliases: HashMap::default(),
|
||||
pages: HashMap::default(),
|
||||
tags: HashMap::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl AppState {
|
||||
fn load(cfg: Settings) -> Result<AppState> {
|
||||
let base_url: Uri = cfg.base_url.parse()?;
|
||||
|
||||
let tera = Tera::new("templates/**/*")?;
|
||||
let mut state = AppState {
|
||||
base_url,
|
||||
tera,
|
||||
settings: cfg,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
let root_path = Path::new("pages/");
|
||||
let pages = page::load_recursive(&state, root_path, root_path, None)?;
|
||||
info!("{} pages loaded", pages.len());
|
||||
|
||||
let tags = tag::get_tags(pages.values());
|
||||
state.aliases = pages
|
||||
.values()
|
||||
.flat_map(|p| {
|
||||
p.aliases
|
||||
.iter()
|
||||
.map(|a| (a.clone(), p.absolute_path.clone()))
|
||||
})
|
||||
.collect();
|
||||
|
||||
state.pages = pages;
|
||||
state.tags = tags;
|
||||
Ok(state)
|
||||
}
|
||||
}
|
||||
use settings::Settings;
|
||||
use state::AppState;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
|
@ -262,13 +199,3 @@ async fn shutdown_signal() {
|
|||
() = terminate => {},
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::{AppState, settings::Settings};
|
||||
|
||||
#[test]
|
||||
fn appstate_load() {
|
||||
_ = AppState::load(Settings::test_config()).unwrap();
|
||||
}
|
||||
}
|
||||
|
|
79
src/state.rs
Normal file
79
src/state.rs
Normal file
|
@ -0,0 +1,79 @@
|
|||
use std::{collections::HashMap, path::Path};
|
||||
|
||||
use anyhow::Result;
|
||||
use axum::http::Uri;
|
||||
use tera::Tera;
|
||||
use time::OffsetDateTime;
|
||||
use tracing::info;
|
||||
|
||||
use crate::{
|
||||
page::{self, Page},
|
||||
settings::Settings,
|
||||
tag::{self, Tag},
|
||||
};
|
||||
|
||||
pub struct AppState {
|
||||
pub startup_time: OffsetDateTime,
|
||||
pub base_url: Uri,
|
||||
pub pages: HashMap<String, Page>,
|
||||
pub aliases: HashMap<String, String>,
|
||||
pub settings: Settings,
|
||||
pub tags: HashMap<String, Tag>,
|
||||
pub tera: Tera,
|
||||
}
|
||||
|
||||
impl Default for AppState {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
startup_time: OffsetDateTime::now_utc(),
|
||||
base_url: Uri::default(),
|
||||
tera: Tera::default(),
|
||||
settings: Settings::default(),
|
||||
aliases: HashMap::default(),
|
||||
pages: HashMap::default(),
|
||||
tags: HashMap::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl AppState {
|
||||
pub fn load(cfg: Settings) -> Result<AppState> {
|
||||
let base_url: Uri = cfg.base_url.parse()?;
|
||||
|
||||
let tera = Tera::new("templates/**/*")?;
|
||||
let mut state = AppState {
|
||||
base_url,
|
||||
tera,
|
||||
settings: cfg,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
let root_path = Path::new("pages/");
|
||||
let pages = page::load_recursive(&state, root_path, root_path, None)?;
|
||||
info!("{} pages loaded", pages.len());
|
||||
|
||||
let tags = tag::get_tags(pages.values());
|
||||
state.aliases = pages
|
||||
.values()
|
||||
.flat_map(|p| {
|
||||
p.aliases
|
||||
.iter()
|
||||
.map(|a| (a.clone(), p.absolute_path.clone()))
|
||||
})
|
||||
.collect();
|
||||
|
||||
state.pages = pages;
|
||||
state.tags = tags;
|
||||
Ok(state)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::{AppState, settings::Settings};
|
||||
|
||||
#[test]
|
||||
fn appstate_load() {
|
||||
_ = AppState::load(Settings::test_config()).unwrap();
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue