<h1 align="center">Víz</h1>
<div align="center">
<p><strong>Fast, robust, flexible, lightweight web framework for Rust</strong></p>
</div>
<div align="center">
<a href="/">
<img src="https://img.shields.io/badge/-safety!-success?style=flat-square"
alt="Safety!" /></a>
<a href="https://docs.rs/viz">
<img src="https://img.shields.io/badge/docs-latest-blue.svg?style=flat-square"
alt="Docs.rs docs" /></a>
<a href="https://crates.io/crates/viz">
<img src="https://img.shields.io/crates/v/viz.svg?style=flat-square"
alt="Crates.io version" /></a>
<a href="https://crates.io/crates/viz">
<img src="https://img.shields.io/crates/d/viz.svg?style=flat-square"
alt="Download" /></a>
<a href="https://discord.gg/cjX2KX">
<img src="https://img.shields.io/discord/699908392105541722?logo=discord&style=flat-square"
alt="Discord"></a>
<a href="https://twitter.com/_fundon">
<img src="https://img.shields.io/badge/twitter-@__fundon-blue.svg?style=flat-square"
alt="Twitter: @_fundon" /></a>
</div>
## 🦀 Features
* **Safety** `#![forbid(unsafe_code)]`
* Lightweight
* Robust `Routing`
* Flexible + Simple `Handler` & `Middleware`
* Easy use `Extractors`
## Example
```rust,no_run
use std::net::SocketAddr;
use viz::{get, Body, Request, Result, Router, Server, ServiceMaker};
async fn index(_: Request<Body>) -> Result<&'static str> {
Ok("Hello, World!")
}
#[tokio::main]
async fn main() -> Result<()> {
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
println!("listening on {}", addr);
let app = Router::new().route("/", get(index));
if let Err(err) = Server::bind(&addr)
.tcp_nodelay(true)
.serve(ServiceMaker::from(app))
.await
{
println!("{}", err);
}
Ok(())
}
```
## License
Licensed under either of [Apache License, Version 2.0](LICENSE-APACHE) or
[MIT license](LICENSE-MIT) at your option.
### Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in Viz by you, as defined in the Apache-2.0 license, shall
be dual licensed as above, without any additional terms or conditions.