#![deny(clippy::pedantic)]
#![allow(clippy::missing_errors_doc, clippy::missing_panics_doc)]
extern crate core;
pub mod app_config;
pub mod cli;
pub mod dynamic_component;
pub mod file_cache;
pub mod filesystem;
pub mod render;
pub mod telemetry;
pub mod telemetry_metrics;
pub mod template_helpers;
pub mod templates;
pub mod utils;
pub mod webserver;
use crate::app_config::AppConfig;
use crate::filesystem::FileSystem;
use crate::webserver::database::ParsedSqlFile;
use crate::webserver::oidc::OidcState;
use file_cache::FileCache;
use std::path::{Path, PathBuf};
use std::sync::Arc;
use telemetry_metrics::TelemetryMetrics;
use templates::AllTemplates;
use webserver::Database;
pub const TEMPLATES_DIR: &str = "sqlpage/templates/";
pub const MIGRATIONS_DIR: &str = "migrations";
pub const ON_CONNECT_FILE: &str = "on_connect.sql";
pub const ON_RESET_FILE: &str = "on_reset.sql";
pub const DEFAULT_404_FILE: &str = "default_404.sql";
pub struct AppState {
pub db: Database,
all_templates: AllTemplates,
sql_file_cache: FileCache<ParsedSqlFile>,
file_system: FileSystem,
config: AppConfig,
pub oidc_state: Option<Arc<OidcState>>,
pub telemetry_metrics: TelemetryMetrics,
}
impl AppState {
pub async fn init(config: &AppConfig) -> anyhow::Result<Self> {
let db = Database::init(config).await?;
Self::init_with_db(config, db).await
}
pub async fn init_with_db(config: &AppConfig, db: Database) -> anyhow::Result<Self> {
let all_templates = AllTemplates::init(config)?;
let mut sql_file_cache = FileCache::new();
let file_system = FileSystem::init(&config.web_root, &db).await;
sql_file_cache.add_static(
PathBuf::from("index.sql"),
ParsedSqlFile::new(&db, include_str!("index.sql"), Path::new("index.sql")),
);
sql_file_cache.add_static(
PathBuf::from(DEFAULT_404_FILE),
ParsedSqlFile::new(
&db,
include_str!("default_404.sql"),
Path::new(DEFAULT_404_FILE),
),
);
let oidc_state = crate::webserver::oidc::initialize_oidc_state(config).await?;
let telemetry_metrics =
TelemetryMetrics::new(&db.connection, db.info.database_type.otel_name());
Ok(AppState {
db,
all_templates,
sql_file_cache,
file_system,
config: config.clone(),
oidc_state,
telemetry_metrics,
})
}
}
impl std::fmt::Debug for AppState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("AppState").finish()
}
}