zip_static_handler 0.22.0

Static file handler from zip archive
Documentation
use reqwest::Client;
use salvo::conn::TcpListener;
use salvo::logging::Logger;
use salvo::{handler, Listener, Router, Server, Service};
use zip_static_handler::github::zip_download_branch_url;
use zip_static_handler::handler::Handler;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    tracing_subscriber::fmt()
        .compact()
        .with_env_filter("zip_static_handler=info,salvo=trace")
        .without_time()
        .with_line_number(false)
        .with_file(false)
        .try_init()
        .expect("could not init tracing subscriber");
    let zip = download(&zip_download_branch_url(
        "programingjd",
        "about.programingjd.me",
        "main",
    ))
    .await?;

    let state = Handler::builder()
        .with_zip_prefix("about.programingjd.me-main/")
        .with_zip(zip)
        .try_build()?;

    let router = Router::new()
        .push(Router::with_path("version").get(version))
        .push(Router::with_path("{**path}").get(state));

    let acceptor = TcpListener::new("127.0.0.1:8080").bind().await;
    Server::new(acceptor)
        .serve(Service::new(router).hoop(Logger::new()))
        .await;
    Ok(())
}

#[handler]
async fn version() -> &'static str {
    "1.0"
}

async fn download(url: &str) -> Result<Vec<u8>, reqwest::Error> {
    let response = Client::default().get(url).send().await?;
    if !response.status().is_success() {
        panic!("failed to download {url} ({})", response.status().as_str());
    }
    Ok(response.bytes().await?.to_vec())
}