add static serving
This commit is contained in:
parent
435337240a
commit
01df079b35
20
Cargo.lock
generated
20
Cargo.lock
generated
|
@ -1172,6 +1172,16 @@ version = "0.3.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mime_guess"
|
||||||
|
version = "2.0.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
|
||||||
|
dependencies = [
|
||||||
|
"mime",
|
||||||
|
"unicase",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "minijinja"
|
name = "minijinja"
|
||||||
version = "2.1.1"
|
version = "2.1.1"
|
||||||
|
@ -1502,6 +1512,7 @@ dependencies = [
|
||||||
"include_dir",
|
"include_dir",
|
||||||
"linux-embedded-hal",
|
"linux-embedded-hal",
|
||||||
"mime",
|
"mime",
|
||||||
|
"mime_guess",
|
||||||
"minijinja",
|
"minijinja",
|
||||||
"minijinja-embed",
|
"minijinja-embed",
|
||||||
"palette",
|
"palette",
|
||||||
|
@ -2317,6 +2328,15 @@ dependencies = [
|
||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicase"
|
||||||
|
version = "2.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
|
||||||
|
dependencies = [
|
||||||
|
"version_check",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.12"
|
version = "1.0.12"
|
||||||
|
|
|
@ -16,6 +16,7 @@ image = "0.25.1"
|
||||||
include_dir = "0.7.4"
|
include_dir = "0.7.4"
|
||||||
linux-embedded-hal = { version = "0.4.0"}
|
linux-embedded-hal = { version = "0.4.0"}
|
||||||
mime = "0.3.17"
|
mime = "0.3.17"
|
||||||
|
mime_guess = "2.0.5"
|
||||||
minijinja = { version = "2.1.0", features = ["loader"] }
|
minijinja = { version = "2.1.0", features = ["loader"] }
|
||||||
minijinja-embed = "2.1.1"
|
minijinja-embed = "2.1.1"
|
||||||
palette = "0.7.6"
|
palette = "0.7.6"
|
||||||
|
|
19
src/app.rs
19
src/app.rs
|
@ -2,7 +2,7 @@ use crate::api;
|
||||||
use crate::display::create_display_thread;
|
use crate::display::create_display_thread;
|
||||||
use crate::dither::{DitherMethod, DitheredImage};
|
use crate::dither::{DitherMethod, DitheredImage};
|
||||||
use crate::eink::Palette;
|
use crate::eink::Palette;
|
||||||
use axum::extract::State;
|
use axum::extract::{Path, State};
|
||||||
use axum::http::{header, StatusCode};
|
use axum::http::{header, StatusCode};
|
||||||
use axum::response::{IntoResponse, Response};
|
use axum::response::{IntoResponse, Response};
|
||||||
use axum::routing::{get, post};
|
use axum::routing::{get, post};
|
||||||
|
@ -11,6 +11,7 @@ use base64::{engine::general_purpose::STANDARD, Engine as _};
|
||||||
use image::imageops::{resize, FilterType};
|
use image::imageops::{resize, FilterType};
|
||||||
use include_dir::{include_dir, Dir, DirEntry};
|
use include_dir::{include_dir, Dir, DirEntry};
|
||||||
use minijinja::{context, Environment};
|
use minijinja::{context, Environment};
|
||||||
|
use mime_guess::Mime;
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
@ -108,7 +109,7 @@ pub fn make_app_router() -> Router {
|
||||||
.route("/app", get(app_handler))
|
.route("/app", get(app_handler))
|
||||||
.route("/app/preview", post(app_preview))
|
.route("/app/preview", post(app_preview))
|
||||||
.nest("/api", api::router())
|
.nest("/api", api::router())
|
||||||
.route("/assets", get(asset_handler))
|
.route("/static/*path", get(asset_handler))
|
||||||
.with_state(AppState::default())
|
.with_state(AppState::default())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,8 +154,18 @@ async fn app_preview(
|
||||||
Ok((StatusCode::OK, headers, content))
|
Ok((StatusCode::OK, headers, content))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn asset_handler() -> Result<impl IntoResponse, AppError> {
|
async fn asset_handler(Path(s): Path<String>) -> Result<impl IntoResponse, AppError> {
|
||||||
Ok(StatusCode::OK)
|
let Some(file) = ASSETS_DIR.get_file(&s) else {
|
||||||
|
panic!("fixme");
|
||||||
|
};
|
||||||
|
|
||||||
|
let mime = mime_guess::from_path(s).first_or_text_plain();
|
||||||
|
|
||||||
|
let headers = [
|
||||||
|
(header::CONTENT_TYPE, mime.essence_str().to_string())
|
||||||
|
];
|
||||||
|
|
||||||
|
Ok((StatusCode::OK, headers, file.contents()))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
@ -104,8 +104,7 @@ pub fn get_display() -> Box<dyn EInkPanel + Send> {
|
||||||
/// used in an async context since updating the display can take ~30 seconds.
|
/// used in an async context since updating the display can take ~30 seconds.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
#[instrument(skip_all)]
|
#[instrument(skip_all)]
|
||||||
pub fn create_display_thread(
|
pub fn create_display_thread() -> (thread::JoinHandle<()>, mpsc::Sender<Box<DitheredImage>>) {
|
||||||
) -> (thread::JoinHandle<()>, mpsc::Sender<Box<DitheredImage>>) {
|
|
||||||
let mut display = get_display();
|
let mut display = get_display();
|
||||||
let (tx, rx) = mpsc::channel::<Box<DitheredImage>>();
|
let (tx, rx) = mpsc::channel::<Box<DitheredImage>>();
|
||||||
let handle = thread::spawn(move || {
|
let handle = thread::spawn(move || {
|
||||||
|
|
|
@ -84,9 +84,7 @@ async fn main() -> anyhow::Result<()> {
|
||||||
display.display(&eink_buf)?;
|
display.display(&eink_buf)?;
|
||||||
}
|
}
|
||||||
Command::Serve => {
|
Command::Serve => {
|
||||||
|
let app = app::make_app_router().layer(TraceLayer::new_for_http());
|
||||||
let app = app::make_app_router()
|
|
||||||
.layer(TraceLayer::new_for_http());
|
|
||||||
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await?;
|
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await?;
|
||||||
info!("Listening on 0.0.0.0:3000");
|
info!("Listening on 0.0.0.0:3000");
|
||||||
axum::serve(listener, app).await?;
|
axum::serve(listener, app).await?;
|
||||||
|
|
5
static/alpine.js
Normal file
5
static/alpine.js
Normal file
File diff suppressed because one or more lines are too long
1
static/htmx.js
Normal file
1
static/htmx.js
Normal file
File diff suppressed because one or more lines are too long
4
static/pico.css
Normal file
4
static/pico.css
Normal file
File diff suppressed because one or more lines are too long
|
@ -4,18 +4,15 @@
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>{% block title %} My Site {% endblock %}</title>
|
<title>{% block title %} My Site {% endblock %}</title>
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css">
|
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"> -->
|
||||||
<script src="https://unpkg.com/htmx.org@2.0.1" integrity="sha384-QWGpdj554B4ETpJJC9z+ZHJcA/i59TyjxEPXiiUgN2WmTyV5OEZWCD6gQhgkdpB/" crossorigin="anonymous"></script>
|
<!-- <script src="https://unpkg.com/htmx.org@2.0.1" integrity="sha384-QWGpdj554B4ETpJJC9z+ZHJcA/i59TyjxEPXiiUgN2WmTyV5OEZWCD6gQhgkdpB/" crossorigin="anonymous"></script> -->
|
||||||
|
<link rel="stylesheet" href="/static/pico.css">
|
||||||
|
<script src="/static/htmx.js"></script>
|
||||||
|
<script src="/static/alpine.js"></script>
|
||||||
{% block head %}{% endblock %}
|
{% block head %}{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h1 class="title">
|
|
||||||
Hello World
|
|
||||||
</h1>
|
|
||||||
<p class="subtitle">
|
|
||||||
My first website with <strong>Bulma</strong>!
|
|
||||||
</p>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
Loading…
Reference in a new issue