summaryrefslogtreecommitdiffstats
path: root/vendor/askama/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/askama/src/lib.rs')
-rw-r--r--vendor/askama/src/lib.rs133
1 files changed, 76 insertions, 57 deletions
diff --git a/vendor/askama/src/lib.rs b/vendor/askama/src/lib.rs
index 185e8cc76..17085b5d6 100644
--- a/vendor/askama/src/lib.rs
+++ b/vendor/askama/src/lib.rs
@@ -59,23 +59,27 @@
//! in the configuration file. The default syntax , "default", is the one
//! provided by Askama.
-#![allow(unused_imports)]
+#![forbid(unsafe_code)]
#![deny(elided_lifetimes_in_paths)]
+#![deny(unreachable_pub)]
-#[macro_use]
-extern crate askama_derive;
-pub use askama_shared as shared;
+mod error;
+pub mod filters;
+pub mod helpers;
-use std::fs::{self, DirEntry};
-use std::io;
-use std::path::Path;
+use std::fmt;
-pub use askama_escape::{Html, Text};
+pub use askama_derive::Template;
+pub use askama_escape::{Html, MarkupDisplay, Text};
+
+#[doc(hidden)]
+pub use crate as shared;
+pub use crate::error::{Error, Result};
/// Main `Template` trait; implementations are generally derived
///
/// If you need an object-safe template, use [`DynTemplate`].
-pub trait Template {
+pub trait Template: fmt::Display {
/// Helper method which allocates a new `String` and renders into it
fn render(&self) -> Result<String> {
let mut buf = String::with_capacity(Self::SIZE_HINT);
@@ -83,14 +87,23 @@ pub trait Template {
Ok(buf)
}
- /// Renders the template to the given `writer` buffer
+ /// Renders the template to the given `writer` fmt buffer
fn render_into(&self, writer: &mut (impl std::fmt::Write + ?Sized)) -> Result<()>;
+ /// Renders the template to the given `writer` io buffer
+ #[inline]
+ fn write_into(&self, writer: &mut (impl std::io::Write + ?Sized)) -> std::io::Result<()> {
+ writer.write_fmt(format_args!("{self}"))
+ }
+
/// The template's extension, if provided
const EXTENSION: Option<&'static str>;
/// 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
@@ -100,14 +113,20 @@ pub trait DynTemplate {
/// Helper method which allocates a new `String` and renders into it
fn dyn_render(&self) -> Result<String>;
- /// Renders the template to the given `writer` buffer
+ /// Renders the template to the given `writer` fmt buffer
fn dyn_render_into(&self, writer: &mut dyn std::fmt::Write) -> Result<()>;
+ /// Renders the template to the given `writer` io buffer
+ fn dyn_write_into(&self, writer: &mut dyn std::io::Write) -> std::io::Result<()>;
+
/// Helper function to inspect the template's extension
fn extension(&self) -> Option<&'static str>;
/// 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 {
@@ -119,6 +138,11 @@ impl<T: Template> DynTemplate for T {
<Self as Template>::render_into(self, writer)
}
+ #[inline]
+ fn dyn_write_into(&self, writer: &mut dyn std::io::Write) -> std::io::Result<()> {
+ writer.write_fmt(format_args!("{self}"))
+ }
+
fn extension(&self) -> Option<&'static str> {
Self::EXTENSION
}
@@ -126,75 +150,70 @@ impl<T: Template> DynTemplate for T {
fn size_hint(&self) -> usize {
Self::SIZE_HINT
}
-}
-pub use crate::shared::filters;
-pub use crate::shared::helpers;
-pub use crate::shared::{read_config_file, Error, MarkupDisplay, Result};
-pub use askama_derive::*;
-
-pub mod mime {
- #[cfg(all(feature = "mime_guess", feature = "mime"))]
- pub fn extension_to_mime_type(ext: &str) -> mime_guess::Mime {
- let basic_type = mime_guess::from_ext(ext).first_or_octet_stream();
- for (simple, utf_8) in &TEXT_TYPES {
- if &basic_type == simple {
- return utf_8.clone();
- }
- }
- basic_type
+ fn mime_type(&self) -> &'static str {
+ Self::MIME_TYPE
}
-
- #[cfg(all(feature = "mime_guess", feature = "mime"))]
- const TEXT_TYPES: [(mime_guess::Mime, mime_guess::Mime); 6] = [
- (mime::TEXT_PLAIN, mime::TEXT_PLAIN_UTF_8),
- (mime::TEXT_HTML, mime::TEXT_HTML_UTF_8),
- (mime::TEXT_CSS, mime::TEXT_CSS_UTF_8),
- (mime::TEXT_CSV, mime::TEXT_CSV_UTF_8),
- (
- mime::TEXT_TAB_SEPARATED_VALUES,
- mime::TEXT_TAB_SEPARATED_VALUES_UTF_8,
- ),
- (
- mime::APPLICATION_JAVASCRIPT,
- mime::APPLICATION_JAVASCRIPT_UTF_8,
- ),
- ];
}
-/// Old build script helper to rebuild crates if contained templates have changed
-///
-/// This function is now deprecated and does nothing.
-#[deprecated(
- since = "0.8.1",
- note = "file-level dependency tracking is handled automatically without build script"
-)]
-pub fn rerun_if_templates_changed() {}
+impl fmt::Display for dyn DynTemplate {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ self.dyn_render_into(f).map_err(|_| ::std::fmt::Error {})
+ }
+}
#[cfg(test)]
mod tests {
- use super::{DynTemplate, Template};
+ use std::fmt;
+
+ use super::*;
+ use crate::{DynTemplate, Template};
#[test]
fn dyn_template() {
struct Test;
impl Template for Test {
- fn render_into(
- &self,
- writer: &mut (impl std::fmt::Write + ?Sized),
- ) -> askama_shared::Result<()> {
+ fn render_into(&self, writer: &mut (impl std::fmt::Write + ?Sized)) -> Result<()> {
Ok(writer.write_str("test")?)
}
const EXTENSION: Option<&'static str> = Some("txt");
const SIZE_HINT: usize = 4;
+
+ const MIME_TYPE: &'static str = "text/plain; charset=utf-8";
+ }
+
+ impl fmt::Display for Test {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ self.render_into(f).map_err(|_| fmt::Error {})
+ }
}
fn render(t: &dyn DynTemplate) -> String {
t.dyn_render().unwrap()
}
- assert_eq!(render(&Test), "test");
+ let test = &Test as &dyn DynTemplate;
+
+ assert_eq!(render(test), "test");
+
+ assert_eq!(test.to_string(), "test");
+
+ assert_eq!(format!("{test}"), "test");
+
+ let mut vec = Vec::new();
+ test.dyn_write_into(&mut vec).unwrap();
+ assert_eq!(vec, vec![b't', b'e', b's', b't']);
}
}
+
+/// Old build script helper to rebuild crates if contained templates have changed
+///
+/// This function is now deprecated and does nothing.
+#[deprecated(
+ since = "0.8.1",
+ note = "file-level dependency tracking is handled automatically without build script"
+)]
+pub fn rerun_if_templates_changed() {}