Shio is a fast, simple, and asynchronous micro web-framework for Rust.
-
Asynchronous. Handlers are both handled asynchronously and may be asynchronous themselves. A
shio::Handler
receives atokio_core::reactor::Handle
which may be used to schedule additional work on the thread-local event loop. -
Multithreaded. By default, requests are handled by multiple threads, each running an event loop powered by
tokio
. -
Stability. Shio is fully committed to working and continuing to work on stable Rust.
[dependencies]
shio = "0.2.0"
extern crate shio;
use shio::prelude::*;
fn hello_world(_: Context) -> Response {
Response::with("Hello World!\n")
}
fn hello(ctx: Context) -> Response {
Response::with(format!("Hello, {}!\n", &ctx.get::<Parameters>()["name"]))
}
fn main() {
Shio::default()
.route((Method::GET, "/", hello_world))
.route((Method::GET, "/{name}", hello))
.run(":7878").unwrap();
}
A request handler is a value that implements the shio::Handler
trait.
Handlers are not cloned on each request and therefore may contain state.
Note that any fields must be Send + Sync
.
extern crate shio;
use std::thread;
use std::sync::atomic::{AtomicUsize, Ordering};
use shio::prelude::*;
#[derive(Default)]
struct HandlerWithState {
counter: AtomicUsize,
}
impl shio::Handler for HandlerWithState {
type Result = Response;
fn call(&self, _: Context) -> Self::Result {
let counter = self.counter.fetch_add(1, Ordering::Relaxed);
Response::with(format!(
"Hi, #{} (from thread: {:?})\n",
counter,
thread::current().id()
))
}
}
Many more usage examples/ are included with Shio.
- Render templates with Askama
- Stream a HTTP request with Hyper
- Postgres with tokio-postgres
Examples may be ran with cargo run -p <example name>
.
For instance, to run the hello
example, use:
$ cargo run -p hello
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.