mod config;
mod handlers;
mod network;
use config::config;
use url::Url;
use windmark::response::Response;
#[windmark::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let cfg: config::Config = config()?; let version: &'static str = cfg.crate_version;
return windmark::router::Router::new()
.set_private_key_file(format!("{}/key.pem", cfg.certs_dir))
.set_certificate_file(format!("{}/cert.pem", cfg.certs_dir))
.add_header(|_| String::from("# Forgejo Proxy"))
.add_footer(move |_| format!("\nPowered by git-gemini-forge v{version}\n=> https://git.average.name/AverageHelper/git-gemini-forge View source"))
.mount("/", move |_| {
let c: config::Config = cfg.clone();
async move {
match handlers::root::handler(&c) {
Ok(res) => res,
Err(network::error::Error::NetworkFailure) => Response::temporary_failure("Couldn't communicate with the forge."),
Err(network::error::Error::UnexpectedResponse(_)) => Response::temporary_failure("The forge gave us a response we don't understand"),
}
}
})
.mount("/:user", |c| {
return async move {
let user = c.url.path().split("/").last().unwrap_or("");
Response::success(format!("TODO: Present repos for user {user}"))
}
})
.set_error_handler(|error| {
let failure_addr: Url = error.url;
println!("Failed to serve {}", failure_addr.as_str());
return Response::temporary_failure("Something went wrong!");
})
.run()
.await
}