An Asynchronous, Extensible, Micro web framework for Rust.
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
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.
Add this to your cargo.toml
toml
arc-reactor = "0.1"
```rust extern crate arc_reactor;
extern crate serdejson; use arcreactor::prelude::*; use arc_reactor::{Router, ArcReactor, StatusCode};
fn main() { ArcReactor::new() .routes(rootRoutes()) .port(3000) .initiate() .unwrap() }
fn rootRoutes() -> Router { Router::new() .get("/", IndexRoute) }
fn IndexRoute(_req: Request, res: Response) -> FutureResponse { let future = fakeFuture().then(|status| { match status { Ok(isAuth) => { if isAuth { let payload = json!({ "data": "hello world" }); return Ok(payload.into()) // convert json to json response. } } _ => unreachable!() } });
Box::new(future) }
fn fakeFuture() -> impl Future ```rust extern crate arc_reactor; extern crate serdejson;
use arcreactor::prelude::*;
use arc_reactor::{Router, ArcReactor, StatusCode}; fn main() {
ArcReactor::new()
.routes(rootRoutes())
.port(3000)
.initiate()
.unwrap()
} fn rootRoutes() -> Router {
Router::new()
.get("/", IndexRoute)
} fn IndexRoute(_req: Rrequest, res: Response) {
let isAuth = await!(fakeFuture());
if isAuth {
let payload = json!({
"data": "hello world"
}); } res.with_status(StatusCode::UnAuthorized)
} fn fakeFuture() -> impl Future Originally, arc-reactor was designed for the nightly compiler.
But instabilities in 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 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 If you wish to use arc-reactor with it's default features:
- The trait Check out the examples folder and the api documentation to get a feel for how It is Strongly recommended that you read the design document, as it gives you full disclosure on arc-reactor's internals,
as well as the design decisions that were made. Arc-Reactor is highly extensible via middlewares which are placed in the 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. Refer to License.Demo (unstable)
![feature(procmacro, generators, procmacrononitems)] // <== need to add this.
[macro_use]
[service]
return Ok(payload.into()) // convert json to json response.
Nightly Use
libprocmacro
cause it to break everytime a new nightly compiler is released.unstable
feature flag.libprocmacro
is stablized.ArcService
is implemented for all functions that satisfy the signature Fn(Request, Response) -> FutureResponse
- The trait MiddleWare<Request>
is implemented for all functions that satisfy the signature Fn(Request) -> MiddleWareFuture<Request>
- The trait MiddleWare<Response>
is implemented for all functions that satisfy the signature Fn(Response) -> MiddleWareFuture<Response>
- 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
arc reactor
works.
It's well documented and should get you up and running in no time.Design
Contributions
contrib
module.License