1
0
Fork 0

create state module

This commit is contained in:
Adrian Hedqvist 2025-03-23 21:15:49 +01:00
parent 87dd6ee7fb
commit 20d95079b5
Signed by: tollyx
SSH key fingerprint: SHA256:NqZilNUilqR38F1LQMrz2E65ZsA621eT3lO+FqHS48Y
2 changed files with 84 additions and 78 deletions

View file

@ -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
View 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();
}
}