# Arc-reactor
![Arc Reactor](https://preview.ibb.co/dFjdxH/Arc_reactor.png "Arc-Reactor: Asynchronous, Extensible, Micro web framework for Rust.")
An **Asynchronous**, **Extensible**, **Micro** web framework for Rust.
![Crates.io](https://img.shields.io/crates/d/arc-reactor.svg) [![Released API docs](https://docs.rs/arc-reactor/badge.svg)](https://docs.rs/arc-reactor)
## Features
- **Asynchronous**. In arc reactor, Service Handlers are asynchronous by default.
- **Integration With futures-await**. The `#[service]` proc_macro not only derives the `ArcService` trait for your route handler, but also marks it as `#[async]` so you can await on futures in your route handlers with no extra stress.
- **Intuitive Middleware System**. arc reactor exposes a middleware system that is easy to reason about. Have a look at the [design spec](./DESIGN.md)
- **Minimalistic**. arc reactor is designed to be a very thin abstraction over tokio and hyper.
- **TLS Support**. easy to add tls support.
- **Opt-in to Nightly**. arc reactor uses a lot of cool features, including `proc_macros` which are only available on the nightly channel, using the `unstable` feature flag.
## Installation
Add this to your `cargo.toml`
```toml
arc-reactor = "0.2"
```
## Hello World (default)
![Default](./stable.png)
## Demo (unstable)
![Default](./unstable.png)
## Nightly Use
Originally, arc-reactor was designed for the nightly compiler.
But instabilities in `libprocmacro` cause it to break everytime a new nightly compiler is released.
So by default, arc-reactor no longer uses the nightly compiler, and will work out of the box with the stable compiler. 🎉
This means experimental nightly features including proc_macros are only available behind the `unstable` feature flag.
If you wish to use arc-reactor, with the nightly compiler and unstable feature enabled:
It is recommended that you lock down the compiler version. Until `libprocmacro` is stablized.
If you wish to use arc-reactor with it's default features:
- The trait `ArcService` is implemented for all functions that satisfy the signature `Fn(Request, Response) -> FutureResponse`
- The trait `MiddleWare` is implemented for all functions that satisfy the signature `Fn(Request) -> MiddleWareFuture`
- The trait `MiddleWare` is implemented for all functions that satisfy the signature `Fn(Response) -> MiddleWareFuture`
- `futures` from `futures-rs` is re-exported instead of `futures-await`.
- you lose the ability to `await!` on futures in your ServiceHandlers and MiddleWares.
- Currently, Multipart support is implemented using unstable features, so you would have to implement your own.
## Examples
Check out the examples folder and the [api documentation](https://docs.rs/arc-reactor/~0.1) to get a feel for how `arc reactor` works.
It's well documented and should get you up and running in no time.
## Design
It is Strongly recommended that you read the [design](./DESIGN.md) document, as it gives you full disclosure on arc-reactor's internals,
as well as the design decisions that were made.
## Contributions
Arc-Reactor is highly extensible via middlewares which are placed in the `contrib` module.
Some of the things are missing include:
- [ ] Logger
- [ ] Websocket
- [ ] Support byte range headers
- [x] Asynchronous StaticFileServer
- [x] Json body parser
- [x] Multipart Support
Feel free to submit a PR.
## License
Refer to [License](https://github.com/SeunLanLege/arc-reactor/blob/master/LICENSE).