🏗️ Elegant & Highly Performant Async Gemini Server Framework for the Modern Age
async framework gemini-protocol protocol gemini rust
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Rust 98.9%
Just 1.1%
201 1 0

Clone this repository

https://tangled.org/fuwn.net/windmark https://tangled.org/did:plc:g4lsi6ub2d3kqklfokk3dvmy/windmark
git@tangled.org:fuwn.net/windmark git@tangled.org:did:plc:g4lsi6ub2d3kqklfokk3dvmy/windmark

For self-hosted knots, clone URLs may differ based on your setup.

Download tar.gz
README.md

Windmark#

crates.io docs.rs github.com

Windmark is an elegant and highly performant async Gemini server framework for the modern age!

Now supporting both Tokio and async-std!

Usage#

NOTE

A macro-based "struct-router" is in active development as a simplified alternative to the standard server creation approach. Check out Rossweisse for more information!

Features#

Feature Description
default Base Windmark framework using Tokio
logger Enables the default pretty_env_logger integration
auto-deduce-mime Exposes Responses and macros that automatically fill MIMEs for non-Gemini responses
response-macros Simple macros for all Responses
tokio Marks Tokio as the asynchronous runtime
async-std Marks async-std as the asynchronous runtime
prelude Exposes the prelude module containing the most used Windmark features

Add Windmark and Tokio as Dependencies#

# Cargo.toml

[dependencies]
windmark = "0.3.11"
tokio = { version = "1.26.0", features = ["full"] }

# If you would like to use the built-in logger (recommended)
# windmark = { version = "0.3.11", features = ["logger"] }

# If you would like to use the built-in MIME deduction when `Success`-ing a file
# (recommended)
# windmark = { version = "0.3.11", features = ["auto-deduce-mime"] }

# If you would like to use macro-based responses (as seen below)
# windmark = { version = "0.3.11", features = ["response-macros"] }

Implementing a Windmark Server#

// src/main.rs

// ...

#[windmark::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
  windmark::router::Router::new()
    .set_private_key_file("windmark_private.pem")
    .set_certificate_file("windmark_public.pem")
    .mount("/", windmark::success!("Hello, World!"))
    .set_error_handler(|_|
      windmark::response::Response::permanent_failure("This route does not exist!")
    )
    .run()
    .await
}

Implementing a Windmark Server Using Rossweisse#

// src/main.rs

// ...

#[rossweisse::router]
struct Router;

#[rossweisse::router]
impl Router {
  #[route(index)]
  pub fn index(
    _context: windmark::context::RouteContext,
  ) -> Response {
    Response::success("Hello, World!")
  }
}

// ...

Examples#

Examples can be found within the examples/ directory along with a rundown of each of their purposes and useful facts.

Run an example by cloning this repository and running cargo run --example example_name.

Modules#

Modules are composable extensions which can be procedurally mounted onto Windmark routers.

Examples#

License#

This project is licensed with the GNU General Public License v3.0.