via 2.0.0-gm.25

An async multi-threaded web framework for people who appreciate simplicity.
Documentation
use std::process::ExitCode;
use via::{Error, Finalize, Next, Request, Response, Server};

async fn echo(request: Request, _: Next) -> via::Result {
    request.finalize(Response::build())
}

#[cfg(not(any(feature = "tokio-tungstenite", feature = "tokio-websockets")))]
async fn relay(request: Request, next: Next) -> via::Result {
    next.call(request).await
}

#[cfg(any(feature = "tokio-tungstenite", feature = "tokio-websockets"))]
async fn relay(mut channel: via::ws::Channel, _: via::ws::Request) -> via::ws::Result {
    while let Some(message) = channel.recv().await {
        if message.is_close() {
            eprintln!("info: close requested by client");
            break;
        }

        if message.is_binary() || message.is_text() {
            channel.send(message).await?;
        } else if cfg!(debug_assertions) {
            eprintln!("warn: ignoring message {:?}", message);
        }
    }

    Ok(())
}

#[tokio::main]
async fn main() -> Result<ExitCode, Error> {
    let mut app = via::app(());

    #[cfg(any(feature = "tokio-tungstenite", feature = "tokio-websockets"))]
    let relay = via::ws(relay);

    app.route("/echo").to(via::post(echo).get(relay));

    Server::new(app).listen(("127.0.0.1", 8080)).await
}