From 85ad2e6ba3a205e9b648431318aac0e75c027a82 Mon Sep 17 00:00:00 2001 From: René Kijewski Date: Fri, 28 Jan 2022 10:48:46 +0100 Subject: Implement error propagation expression: `?` (#590) This change allows using the operator `?` in askama expressions. It works like the same operator in Rust: if a `Result` is `Ok`, it is unwrapped. If it is an error, then the `render()` method fails with this error value. --- askama_shared/src/error.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'askama_shared/src/error.rs') diff --git a/askama_shared/src/error.rs b/askama_shared/src/error.rs index 4394eea..98f2703 100644 --- a/askama_shared/src/error.rs +++ b/askama_shared/src/error.rs @@ -1,6 +1,6 @@ use std::fmt::{self, Display}; -pub type Result = ::std::result::Result; +pub type Result = ::std::result::Result; /// askama error type /// @@ -28,6 +28,9 @@ pub enum Error { /// formatting error Fmt(fmt::Error), + /// an error raised by using `?` in a template + Custom(Box), + /// json conversion error #[cfg(feature = "serde_json")] Json(::serde_json::Error), @@ -41,6 +44,7 @@ impl std::error::Error for Error { fn cause(&self) -> Option<&dyn std::error::Error> { match *self { Error::Fmt(ref err) => err.source(), + Error::Custom(ref err) => Some(err.as_ref()), #[cfg(feature = "serde_json")] Error::Json(ref err) => err.source(), #[cfg(feature = "serde_yaml")] @@ -51,12 +55,13 @@ impl std::error::Error for Error { impl Display for Error { fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - Error::Fmt(ref err) => write!(formatter, "formatting error: {}", err), + match self { + Error::Fmt(err) => write!(formatter, "formatting error: {}", err), + Error::Custom(err) => write!(formatter, "{}", err), #[cfg(feature = "serde_json")] - Error::Json(ref err) => write!(formatter, "json conversion error: {}", err), + Error::Json(err) => write!(formatter, "json conversion error: {}", err), #[cfg(feature = "serde_yaml")] - Error::Yaml(ref err) => write!(formatter, "yaml conversion error: {}", err), + Error::Yaml(err) => write!(formatter, "yaml conversion error: {}", err), } } } -- cgit