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.
|
|
|
|
|
2021-01-15 17:40:46 +13:00
|
|
|
```rust,no_run
|
|
|
|
use actix_web::{get, App, HttpServer, Result as AwResult};
|
2018-11-24 16:44:53 +13:00
|
|
|
use maud::{html, Markup};
|
2021-01-15 17:40:46 +13:00
|
|
|
use std::io;
|
|
|
|
|
|
|
|
#[get("/")]
|
|
|
|
async fn index() -> AwResult<Markup> {
|
|
|
|
Ok(html! {
|
|
|
|
html {
|
|
|
|
body {
|
|
|
|
h1 { "Hello World!" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
2018-11-24 16:44:53 +13:00
|
|
|
}
|
|
|
|
|
2021-01-15 17:40:46 +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:
|
|
|
|
|
2021-01-15 17:40:46 +13:00
|
|
|
```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:
|
|
|
|
|
2021-01-15 17:40:46 +13:00
|
|
|
```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®.
|
|
|
|
|
2021-01-15 17:40:46 +13:00
|
|
|
```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}) => {
|
2021-01-15 17:40:46 +13:00
|
|
|
Response::html(html! {
|
2018-11-24 16:44:53 +13:00
|
|
|
h1 { "Hello, " (name) "!" }
|
|
|
|
p { "Nice to meet you!" }
|
2021-01-15 17:40:46 +13:00
|
|
|
})
|
2018-11-24 16:44:53 +13:00
|
|
|
},
|
|
|
|
_ => Response::empty_404()
|
|
|
|
)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
```
|