Skip to content

๐Ÿ—๏ธ Elegant & Highly Performant Async Gemini Server Framework for the Modern Age

License

Notifications You must be signed in to change notification settings

gemrest/windmark

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

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.

About

๐Ÿ—๏ธ Elegant & Highly Performant Async Gemini Server Framework for the Modern Age

Topics

Resources

License

Stars

Watchers

Forks

Languages