maud/docs/content/web-frameworks.md

136 lines
2.9 KiB
Markdown
Raw Normal View History

2018-11-24 16:44:53 +13:00
# Web framework integration
Maud includes support for these web frameworks: [Actix], [Iron], [Rocket], and [Rouille].
[Actix]: https://actix.rs/
[Iron]: http://ironframework.io
[Rocket]: https://rocket.rs/
[Rouille]: https://github.com/tomaka/rouille
# Actix
Actix support is available with the "actix-web" feature:
```toml
# ...
[dependencies]
maud = { version = "*", features = ["actix-web"] }
# ...
```
Actix request handlers can use a `Markup` that implements the `actix_web::Responder` trait.
```rust,no_run
use actix_web::{get, App, HttpServer, Result as AwResult};
2018-11-24 16:44:53 +13:00
use maud::{html, Markup};
use std::io;
#[get("/")]
async fn index() -> AwResult<Markup> {
Ok(html! {
html {
body {
h1 { "Hello World!" }
}
}
})
2018-11-24 16:44:53 +13:00
}
#[actix_web::main]
async fn main() -> io::Result<()> {
HttpServer::new(|| App::new().service(index))
.bind(("127.0.0.1", 8080))?
.run()
.await
2018-11-24 16:44:53 +13:00
}
```
# Iron
Iron support is available with the "iron" feature:
```toml
# ...
[dependencies]
maud = { version = "*", features = ["iron"] }
# ...
```
With this feature enabled, you can then build a `Response` from a `Markup` object directly. Here's an example application using Iron and Maud:
```rust,no_run
2018-11-24 16:44:53 +13:00
use iron::prelude::*;
use iron::status;
use maud::html;
fn main() {
Iron::new(|r: &mut Request| {
let markup = html! {
h1 { "Hello, world!" }
p {
"You are viewing the page at " (r.url)
}
};
Ok(Response::with((status::Ok, markup)))
}).http("localhost:3000").unwrap();
}
```
`Markup` will set the content type of the response automatically, so you don't need to add it yourself.
# Rocket
Rocket works in a similar way, except using the `rocket` feature:
```toml
# ...
[dependencies]
maud = { version = "*", features = ["rocket"] }
# ...
```
This adds a `Responder` implementation for the `Markup` type, so you can return the result directly:
```rust,no_run
#![feature(decl_macro)]
2018-11-24 16:44:53 +13:00
use maud::{html, Markup};
2019-03-16 19:53:24 +13:00
use rocket::{get, routes};
2018-11-24 16:44:53 +13:00
use std::borrow::Cow;
#[get("/<name>")]
fn hello<'a>(name: Cow<'a, str>) -> Markup {
html! {
h1 { "Hello, " (name) "!" }
p { "Nice to meet you!" }
}
}
fn main() {
rocket::ignite().mount("/", routes![hello]).launch();
}
```
# Rouille
Unlike with the other frameworks, Rouille doesn't need any extra features at all! Calling `Response::html` on the rendered `Markup` will Just Work®.
```rust,no_run
2018-11-24 16:44:53 +13:00
use maud::html;
2019-03-16 19:53:24 +13:00
use rouille::{Response, router};
2018-11-24 16:44:53 +13:00
fn main() {
rouille::start_server("localhost:8000", move |request| {
router!(request,
(GET) (/{name: String}) => {
Response::html(html! {
2018-11-24 16:44:53 +13:00
h1 { "Hello, " (name) "!" }
p { "Nice to meet you!" }
})
2018-11-24 16:44:53 +13:00
},
_ => Response::empty_404()
)
});
}
```