2025-03-22 22:17:47 -04:00
|
|
|
mod assets;
|
|
|
|
mod avif;
|
|
|
|
mod macros;
|
|
|
|
mod routes;
|
|
|
|
|
2025-03-23 12:31:48 -04:00
|
|
|
use assets::{init_dirs, write_assets};
|
2025-03-22 22:17:47 -04:00
|
|
|
pub use tetratto_core::*;
|
|
|
|
|
|
|
|
use axum::{Extension, Router};
|
2025-03-29 22:27:57 -04:00
|
|
|
use tera::{Tera, Value};
|
2025-03-22 22:17:47 -04:00
|
|
|
use tower_http::trace::{self, TraceLayer};
|
|
|
|
use tracing::{Level, info};
|
|
|
|
|
2025-03-29 22:27:57 -04:00
|
|
|
use std::{collections::HashMap, sync::Arc};
|
2025-03-22 22:17:47 -04:00
|
|
|
use tokio::sync::RwLock;
|
|
|
|
|
|
|
|
pub(crate) type State = Arc<RwLock<(DataManager, Tera)>>;
|
|
|
|
|
2025-03-29 22:27:57 -04:00
|
|
|
fn render_markdown(value: &Value, _: &HashMap<String, Value>) -> tera::Result<Value> {
|
2025-03-31 15:39:49 -04:00
|
|
|
Ok(tetratto_shared::markdown::render_markdown(value.as_str().unwrap()).into())
|
2025-03-29 22:27:57 -04:00
|
|
|
}
|
|
|
|
|
2025-03-22 22:17:47 -04:00
|
|
|
#[tokio::main]
|
|
|
|
async fn main() {
|
|
|
|
tracing_subscriber::fmt()
|
|
|
|
.with_target(false)
|
|
|
|
.compact()
|
|
|
|
.init();
|
|
|
|
|
|
|
|
let config = config::Config::get_config();
|
|
|
|
|
2025-03-23 12:31:48 -04:00
|
|
|
// init
|
|
|
|
init_dirs(&config).await;
|
|
|
|
let html_path = write_assets(&config).await;
|
2025-03-22 22:17:47 -04:00
|
|
|
|
|
|
|
// ...
|
2025-03-23 18:03:11 -04:00
|
|
|
let database = DataManager::new(config.clone()).await.unwrap();
|
|
|
|
database.init().await.unwrap();
|
|
|
|
|
2025-03-29 22:27:57 -04:00
|
|
|
let mut tera = Tera::new(&format!("{html_path}/**/*")).unwrap();
|
|
|
|
tera.register_filter("markdown", render_markdown);
|
|
|
|
|
2025-03-22 22:17:47 -04:00
|
|
|
let app = Router::new()
|
|
|
|
.merge(routes::routes(&config))
|
2025-03-29 22:27:57 -04:00
|
|
|
.layer(Extension(Arc::new(RwLock::new((database, tera)))))
|
2025-03-22 22:17:47 -04:00
|
|
|
.layer(
|
|
|
|
TraceLayer::new_for_http()
|
|
|
|
.make_span_with(trace::DefaultMakeSpan::new().level(Level::INFO))
|
|
|
|
.on_response(trace::DefaultOnResponse::new().level(Level::INFO)),
|
|
|
|
);
|
|
|
|
|
|
|
|
let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{}", config.port))
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
info!("🐐 tetratto.");
|
|
|
|
info!("listening on http://0.0.0.0:{}", config.port);
|
|
|
|
axum::serve(listener, app).await.unwrap();
|
|
|
|
}
|