diff options
author | René Kijewski <kijewski@library.vetmed.fu-berlin.de> | 2022-01-07 01:06:35 +0100 |
---|---|---|
committer | Dirkjan Ochtman <dirkjan@ochtman.nl> | 2022-01-07 13:18:03 +0100 |
commit | a9aebf82fbb59a0323c78c4c248eaaafab1ab00f (patch) | |
tree | 696ce06be753e35efe9d814c14ec42c4b0f8f829 | |
parent | e7fb11ecb9278b946fffd7e6c9f82c29e5b62c94 (diff) | |
download | askama-a9aebf82fbb59a0323c78c4c248eaaafab1ab00f.tar.gz askama-a9aebf82fbb59a0323c78c4c248eaaafab1ab00f.tar.bz2 askama-a9aebf82fbb59a0323c78c4c248eaaafab1ab00f.zip |
Determine Content-Type during compilation
-rw-r--r-- | askama/src/lib.rs | 12 | ||||
-rw-r--r-- | askama_shared/src/generator.rs | 4 | ||||
-rw-r--r-- | askama_shared/src/input.rs | 6 |
3 files changed, 22 insertions, 0 deletions
diff --git a/askama/src/lib.rs b/askama/src/lib.rs index f1aa91c..ccfddc8 100644 --- a/askama/src/lib.rs +++ b/askama/src/lib.rs @@ -86,6 +86,9 @@ pub trait Template { /// Provides a conservative estimate of the expanded length of the rendered template const SIZE_HINT: usize; + + /// The MIME type (Content-Type) of the data that gets rendered by this Template + const MIME_TYPE: &'static str; } /// Object-safe wrapper trait around [`Template`] implementers @@ -103,6 +106,9 @@ pub trait DynTemplate { /// Provides a conservative estimate of the expanded length of the rendered template fn size_hint(&self) -> usize; + + /// The MIME type (Content-Type) of the data that gets rendered by this Template + fn mime_type(&self) -> &'static str; } impl<T: Template> DynTemplate for T { @@ -121,6 +127,10 @@ impl<T: Template> DynTemplate for T { fn size_hint(&self) -> usize { Self::SIZE_HINT } + + fn mime_type(&self) -> &'static str { + Self::MIME_TYPE + } } pub use crate::shared::filters; @@ -162,6 +172,8 @@ mod tests { const EXTENSION: Option<&'static str> = Some("txt"); const SIZE_HINT: usize = 4; + + const MIME_TYPE: &'static str = "text/plain; charset=utf-8"; } fn render(t: &dyn DynTemplate) -> String { diff --git a/askama_shared/src/generator.rs b/askama_shared/src/generator.rs index 5c6303c..cd18819 100644 --- a/askama_shared/src/generator.rs +++ b/askama_shared/src/generator.rs @@ -165,6 +165,10 @@ impl<'a, S: std::hash::BuildHasher> Generator<'a, S> { buf.writeln(&format!("{}", size_hint))?; buf.writeln(";")?; + buf.writeln("const MIME_TYPE: &'static ::std::primitive::str = ")?; + buf.writeln(&format!("{:?}", &self.input.mime_type))?; + buf.writeln(";")?; + buf.writeln("}")?; Ok(()) } diff --git a/askama_shared/src/input.rs b/askama_shared/src/input.rs index a679461..17410ed 100644 --- a/askama_shared/src/input.rs +++ b/askama_shared/src/input.rs @@ -14,6 +14,7 @@ pub struct TemplateInput<'a> { pub print: Print, pub escaper: &'a str, pub ext: Option<String>, + pub mime_type: String, pub parent: Option<&'a syn::Type>, pub path: PathBuf, } @@ -180,6 +181,10 @@ impl TemplateInput<'_> { CompileError::String(format!("no escaper defined for extension '{}'", escaping,)) })?; + let mime_type = + extension_to_mime_type(ext_default_to_path(ext.as_deref(), &path).unwrap_or("txt")) + .to_string(); + Ok(TemplateInput { ast, config, @@ -188,6 +193,7 @@ impl TemplateInput<'_> { print, escaper, ext, + mime_type, parent, path, }) |