#![windows_subsystem = "windows"]
use actix_web::{web, App, HttpRequest, HttpResponse, HttpServer};
use alcro::{Content, UIBuilder};
use mime_guess::from_path;
use rust_embed::RustEmbed;
#[derive(RustEmbed)]
#[folder = "examples/actix-embed"]
struct Asset;
async fn assets(req: HttpRequest) -> HttpResponse {
let path = if req.path() == "/" {
"index.html"
} else {
&req.path()[1..]
};
match Asset::get(path) {
Some(content) => HttpResponse::Ok()
.content_type(from_path(path).first_or_octet_stream().as_ref())
.body(content.data.into_owned()),
None => HttpResponse::NotFound().body("404 Not Found"),
}
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let server = HttpServer::new(|| App::new().default_service(web::get().to(assets)))
.bind("127.0.0.1:0")?;
let port = server.addrs().first().unwrap().port();
let server = server.run();
let server_handle = server.handle();
let server_task = tokio::spawn(server);
let ui = UIBuilder::new()
.content(Content::Url(&format!("http://127.0.0.1:{}", port)))
.size(400, 400)
.run()
.await?;
ui.wait_finish().await;
server_handle.stop(true).await;
server_task.await??;
Ok(())
}