gemfra 0.1.0-dev

A framework for writing gemini CGI scripts
Documentation
use gemfra::{
    error::AnyError, protocol::Scgi, request::Request, response::Response, routed::RoutedApp,
};
use gemfra_codegen::route;

#[route("/")]
async fn main_route(request: Request) -> Result<Response, AnyError> {
    let script = &request.script;
    Ok(Response::success(
        "text/gemini",
        format!(
            "# Hello World

Here is my example routed capsule!

=> {script}/people View your personal page
=> {script}/info/hello View some information on your request
"
        ),
    ))
}

#[route("/people/:name")]
async fn person_route(_request: Request, name: &str) -> Result<Response, AnyError> {
    Ok(Response::success(
        "text/gemini",
        format!(
            "# {name} - A custom page for you

This page was curated specifically for you \"{name}\", Congrats!
",
        ),
    ))
}

#[route("/people")]
async fn person_route_select(request: Request) -> Result<Response, AnyError> {
    if let Some(query) = request.query {
        Ok(Response::redirect(format!(
            "{}{}/{}",
            request.script, request.path, query
        )))
    } else {
        Ok(Response::input("Enter your name"))
    }
}

#[route("/info/*")]
async fn info_route(request: Request) -> Result<Response, AnyError> {
    let url = request.url;
    let addr = request.remote_addr;
    let host = request.remote_host;
    let path = request.path;
    let query = request.query.unwrap_or("".to_owned());

    Ok(Response::success(
        "text/gemini",
        format!(
            "# Info on your request

Your IP is {addr}, with a host of {host}.

Your requested url is '{url}'.

Relative to this cgi, you requested for '{path}'.

Your query is '{query}'
",
        ),
    ))
}

#[tokio::main]
async fn main() {
    let mut app = RoutedApp::new();

    app.register(&main_route);
    app.register(&person_route_select);
    app.register(&person_route);
    app.register(&info_route);

    app.run_scgi("127.0.0.1:8000").await.unwrap();
}