feat: Add embed and noembed feature flags for HTTP assets/templates

This commit is contained in:
selfhoster selfhoster 2026-09-08 17:24:01 +02:00
commit 1bbdb04dc9
5 changed files with 88 additions and 9 deletions

View file

@ -65,10 +65,12 @@ impl DatabaseInterface for MemoryDatabase {
self.create_user(new_user).await
}
fn list_users(&self, domain: Option<String>) -> impl Future<Output = Result<Vec<User>, BoxedError>> {
fn list_users(
&self,
domain: Option<String>,
) -> impl Future<Output = Result<Vec<User>, BoxedError>> {
let users = if let Some(domain) = domain {
self
.users
self.users
.iter()
.filter(|user| user.domain.as_ref() == Some(&domain))
.cloned()

View file

@ -5,8 +5,13 @@ use axum::routing::{get, post};
use axum::serve::Listener as AxumListener;
use axum_extra::extract::cookie::CookieJar;
use http::StatusCode;
use minijinja::{Environment, context, path_loader};
#[cfg(not(feature = "embed"))]
use minijinja::path_loader;
use minijinja::{Environment, context};
#[cfg(feature = "embed")]
use static_serve::embed_assets;
#[cfg(not(feature = "embed"))]
use tower_http::services::ServeDir;
use crate::db::{Database, DatabaseInterface, Operation};
use crate::listener::{Listener, ListenerKind};
@ -67,6 +72,9 @@ pub struct HttpState<D: DatabaseInterface> {
impl<D: DatabaseInterface> HttpState<D> {
pub fn new(db: Database<D>) -> Self {
let mut templates = Environment::new();
#[cfg(feature = "embed")]
minijinja_embed::load_templates!(&mut templates);
#[cfg(not(feature = "embed"))]
templates.set_loader(path_loader("templates"));
Self {
db,
@ -77,9 +85,19 @@ impl<D: DatabaseInterface> HttpState<D> {
}
pub async fn http_listen<D: DatabaseInterface>(listener: Listener, db: Database<D>) {
embed_assets!("assets");
let app = Router::new()
.nest("/assets", static_router())
#[cfg(all(feature = "embed", feature = "noembed"))]
compile_error!("You cannot have `embed` and `noembed` features enabled at the same time.");
#[cfg(not(any(feature = "embed", feature = "noembed")))]
compile_error!("You must have `embed` or `noembed` feature enabled.");
#[cfg(feature = "embed")]
let app = {
embed_assets!("assets");
Router::new().nest("/assets", static_router())
};
#[cfg(not(feature = "embed"))]
let app = { Router::new().nest_service("/assets", ServeDir::new("assets")) };
let app = app
.route("/", get(home))
.route("/login", get(home))
.route("/login", post(login::post_login))