Skip to content

Commit

Permalink
Add support for warp
Browse files Browse the repository at this point in the history
  • Loading branch information
aeons committed Jan 29, 2020
1 parent e507c6f commit ac60a18
Show file tree
Hide file tree
Showing 11 changed files with 103 additions and 1 deletion.
14 changes: 14 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,20 @@ jobs:
cargo test --package askama_rocket --all-targets
cargo clippy --package askama_rocket --all-targets -- -D warnings
Warp:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: nightly
override: true
components: clippy
- run: |
cargo test --package askama_warp --all-targets
cargo clippy --package askama_warp --all-targets -- -D warnings
Lint:
runs-on: ubuntu-latest
steps:
Expand Down
2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ members = [
"askama_iron",
"askama_rocket",
"askama_shared",
"askama_warp",
"testing",
]

default-members = [
"askama",
"askama_derive",
Expand Down
1 change: 1 addition & 0 deletions askama/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ with-iron = ["askama_derive/iron"]
with-rocket = ["askama_derive/rocket"]
with-actix-web = ["askama_derive/actix-web"]
with-gotham = ["askama_derive/gotham"]
with-warp = ["askama_derive/warp"]

[dependencies]
askama_derive = { version = "0.9.0", path = "../askama_derive" }
Expand Down
7 changes: 7 additions & 0 deletions askama/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,13 @@
//! signature, with a status code of `500 Internal Server Error`, mime `*/*`, and an empty `Body`.
//! This preserves the response chain if any custom error handling needs to occur.
//!
//! ## Warp integration
//!
//! Enabling the `with-warp` feature appends an implementation of Warp's `Reply`
//! trait for each template type. This makes it simple to return a template from
//! a Warp filter. See [the example](https://github.com/djc/askama/blob/master/testing/tests/warp.rs)
//! from the Askama test suite for more on how to integrate.
//!
//! ## The `json` filter
//!
//! Enabling the `serde-json` filter will enable the use of the `json` filter.
Expand Down
1 change: 1 addition & 0 deletions askama_derive/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ iron = []
rocket = []
actix-web = []
gotham = []
warp = []

[dependencies]
askama_shared = { version = "0.9", path = "../askama_shared" }
Expand Down
17 changes: 17 additions & 0 deletions askama_derive/src/generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,9 @@ impl<'a> Generator<'a> {
if cfg!(feature = "gotham") {
self.impl_gotham_into_response(&mut buf);
}
if cfg!(feature = "warp") {
self.impl_warp_reply(&mut buf);
}
buf.buf
}

Expand Down Expand Up @@ -272,6 +275,20 @@ impl<'a> Generator<'a> {
buf.writeln("}");
}

fn impl_warp_reply(&mut self, buf: &mut Buffer) {
self.write_header(buf, "::askama_warp::warp::reply::Reply", None);
buf.writeln("fn into_response(self) -> ::askama_warp::warp::reply::Response {");
let ext = self
.input
.path
.extension()
.and_then(|s| s.to_str())
.unwrap_or("txt");
buf.writeln(&format!("::askama_warp::reply(&self, {:?})", ext));
buf.writeln("}");
buf.writeln("}");
}

// Writes header for the `impl` for `TraitFromPathName` or `Template`
// for the given context struct.
fn write_header(
Expand Down
21 changes: 21 additions & 0 deletions askama_warp/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[package]
name = "askama_warp"
version = "0.9.0"
authors = ["Dirkjan Ochtman <dirkjan@ochtman.nl>", "Bjørn Madsen <bm@aeons.dk>"]
description = "Warp integration for Askama templates"
documentation = "https://docs.rs/askama"
keywords = ["markup", "template", "jinja2", "html"]
categories = ["template-engine"]
homepage = "https://github.com/djc/askama"
repository = "https://github.com/djc/askama"
license = "MIT OR Apache-2.0"
workspace = ".."
edition = "2018"

[dependencies]
askama = { version = "0.9.0", path = "../askama", features = ["with-warp", "mime", "mime_guess"] }
warp = "0.2"

[dev-dependencies]
tokio-test = "0.2"
tokio = { version = "0.2", features = ["macros"] }
19 changes: 19 additions & 0 deletions askama_warp/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
pub use askama::*;
pub use warp;

use warp::http::{self, header, StatusCode};
use warp::hyper::Body;
use warp::reply::Response;

pub fn reply<T: askama::Template>(t: &T, ext: &str) -> Response {
match t.render() {
Ok(body) => http::Response::builder()
.status(StatusCode::OK)
.header(header::CONTENT_TYPE, mime::extension_to_mime_type(ext).to_string())
.body(body.into()),
Err(_) => http::Response::builder()
.status(StatusCode::INTERNAL_SERVER_ERROR)
.body(Body::empty()),
}
.unwrap()
}
1 change: 1 addition & 0 deletions askama_warp/templates/hello.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Hello, {{ name }}!
18 changes: 18 additions & 0 deletions askama_warp/tests/warp.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
use askama::Template;
use warp::Filter;

#[derive(Template)]
#[template(path = "hello.html")]
struct HelloTemplate<'a> {
name: &'a str,
}

#[tokio::test]
async fn test_warp() {
let filter = warp::get().map(|| HelloTemplate { name: "world" });

let res = warp::test::request().reply(&filter).await;

assert_eq!(res.status(), 200);
assert_eq!(res.body(), "Hello, world!");
}
3 changes: 2 additions & 1 deletion testing/tests/simple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,9 @@ fn test_option() {

#[derive(Template)]
#[template(path = "generics.html")]
struct GenericsTemplate<T: std::fmt::Display, U = u8>
struct GenericsTemplate<T, U = u8>
where
T: std::fmt::Display,
U: std::fmt::Display,
{
t: T,
Expand Down

0 comments on commit ac60a18

Please sign in to comment.