diff options
-rw-r--r-- | askama/Cargo.toml | 1 | ||||
-rw-r--r-- | askama_derive/Cargo.toml | 1 | ||||
-rw-r--r-- | askama_derive/src/lib.rs | 1 | ||||
-rw-r--r-- | askama_shared/src/generator.rs | 51 | ||||
-rw-r--r-- | askama_shared/src/lib.rs | 1 |
5 files changed, 55 insertions, 0 deletions
diff --git a/askama/Cargo.toml b/askama/Cargo.toml index aa21dcb..4b804ad 100644 --- a/askama/Cargo.toml +++ b/askama/Cargo.toml @@ -27,6 +27,7 @@ num-traits = ["askama_shared/num-traits"] with-actix-web = ["askama_derive/actix-web"] with-gotham = ["askama_derive/gotham"] with-iron = ["askama_derive/iron"] +with-mendes = ["askama_derive/mendes"] with-rocket = ["askama_derive/rocket"] with-tide = ["askama_derive/tide"] with-warp = ["askama_derive/warp"] diff --git a/askama_derive/Cargo.toml b/askama_derive/Cargo.toml index 8e97647..4394444 100644 --- a/askama_derive/Cargo.toml +++ b/askama_derive/Cargo.toml @@ -17,6 +17,7 @@ proc-macro = true actix-web = [] gotham = [] iron = [] +mendes = [] rocket = [] tide = [] warp = [] diff --git a/askama_derive/src/lib.rs b/askama_derive/src/lib.rs index 2277942..cbffa07 100644 --- a/askama_derive/src/lib.rs +++ b/askama_derive/src/lib.rs @@ -88,6 +88,7 @@ const INTEGRATIONS: Integrations = Integrations { actix: cfg!(feature = "actix-web"), gotham: cfg!(feature = "gotham"), iron: cfg!(feature = "iron"), + mendes: cfg!(feature = "mendes"), rocket: cfg!(feature = "rocket"), tide: cfg!(feature = "tide"), warp: cfg!(feature = "warp"), diff --git a/askama_shared/src/generator.rs b/askama_shared/src/generator.rs index 99b8d85..655cdd9 100644 --- a/askama_shared/src/generator.rs +++ b/askama_shared/src/generator.rs @@ -104,6 +104,9 @@ impl<'a, S: std::hash::BuildHasher> Generator<'a, S> { if self.integrations.iron { self.impl_iron_modifier_response(&mut buf); } + if self.integrations.mendes { + self.impl_mendes_responder(&mut buf); + } if self.integrations.rocket { self.impl_rocket_responder(&mut buf); } @@ -264,6 +267,54 @@ impl<'a, S: std::hash::BuildHasher> Generator<'a, S> { buf.writeln("}"); } + // Implement mendes' `Responder`. + fn impl_mendes_responder(&mut self, buf: &mut Buffer) { + let param = syn::parse_str("A: ::mendes::Application").unwrap(); + + let mut generics = self.input.ast.generics.clone(); + generics.params.push(param); + let (_, orig_ty_generics, _) = self.input.ast.generics.split_for_impl(); + let (impl_generics, _, where_clause) = generics.split_for_impl(); + + let mut where_clause = match where_clause { + Some(clause) => clause.clone(), + None => syn::WhereClause { + where_token: syn::Token![where](Span::call_site()), + predicates: syn::punctuated::Punctuated::new(), + }, + }; + + where_clause + .predicates + .push(syn::parse_str("A::ResponseBody: From<String>").unwrap()); + where_clause + .predicates + .push(syn::parse_str("A::Error: From<::mendes::askama::Error>").unwrap()); + + buf.writeln( + format!( + "{} {} for {} {} {{", + quote!(impl#impl_generics), + "::mendes::application::Responder<A>", + self.input.ast.ident, + quote!(#orig_ty_generics #where_clause), + ) + .as_ref(), + ); + + buf.writeln( + "fn into_response(self, app: &A) \ + -> ::mendes::http::Response<A::ResponseBody> {", + ); + + buf.writeln(&format!( + "::mendes::askama::into_response(app, &self, {:?})", + self.input.path.extension() + )); + buf.writeln("}"); + buf.writeln("}"); + } + // Implement Rocket's `Responder`. fn impl_rocket_responder(&mut self, buf: &mut Buffer) { let lifetime = syn::Lifetime::new("'askama", Span::call_site()); diff --git a/askama_shared/src/lib.rs b/askama_shared/src/lib.rs index 2e3d502..9aa93c3 100644 --- a/askama_shared/src/lib.rs +++ b/askama_shared/src/lib.rs @@ -265,6 +265,7 @@ pub struct Integrations { pub actix: bool, pub gotham: bool, pub iron: bool, + pub mendes: bool, pub rocket: bool, pub tide: bool, pub warp: bool, |