use std::error::Error;
use std::fmt::{Display, Formatter};
use super::{TemplateEngineException, TemplateProcessingException};
#[derive(Debug)]
pub struct TemplateOutputException {
processing: TemplateProcessingException,
}
impl TemplateOutputException {
pub fn new<E>(
message: Option<String>,
template_name: Option<String>,
line: i32,
col: i32,
cause: E,
) -> Self
where
E: Error + Send + Sync + 'static,
{
Self {
processing: TemplateProcessingException::with_location_and_cause(
message,
template_name,
line,
col,
cause,
),
}
}
#[must_use]
pub fn get_message(&self) -> String {
self.processing.get_message()
}
#[must_use]
pub fn get_template_name(&self) -> Option<&str> {
self.processing.get_template_name()
}
#[must_use]
pub fn has_template_name(&self) -> bool {
self.processing.has_template_name()
}
#[must_use]
pub fn get_line(&self) -> Option<i32> {
self.processing.get_line()
}
#[must_use]
pub fn get_col(&self) -> Option<i32> {
self.processing.get_col()
}
#[must_use]
pub fn has_line_and_col(&self) -> bool {
self.processing.has_line_and_col()
}
pub fn set_template_name(&mut self, template_name: Option<String>) {
self.processing.set_template_name(template_name);
}
pub fn set_line_and_col(&mut self, line: i32, col: i32) {
self.processing.set_line_and_col(line, col);
}
}
impl Display for TemplateOutputException {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
Display::fmt(&self.processing, formatter)
}
}
impl Error for TemplateOutputException {
fn source(&self) -> Option<&(dyn Error + 'static)> {
self.processing.source()
}
}
impl TemplateEngineException for TemplateOutputException {
fn as_processing_exception_mut(&mut self) -> Option<&mut TemplateProcessingException> {
Some(&mut self.processing)
}
}
impl AsRef<TemplateProcessingException> for TemplateOutputException {
fn as_ref(&self) -> &TemplateProcessingException {
&self.processing
}
}
impl AsMut<TemplateProcessingException> for TemplateOutputException {
fn as_mut(&mut self) -> &mut TemplateProcessingException {
&mut self.processing
}
}
#[cfg(test)]
mod tests {
use std::error::Error;
use std::io;
use super::TemplateOutputException;
#[test]
fn preserves_location_cause_and_inherited_mutation() {
let mut error = TemplateOutputException::new(
Some("output".to_owned()),
Some("index.html".to_owned()),
9,
10,
io::Error::other("writer"),
);
assert_eq!(
error.get_message(),
"output (template: \"index.html\" - line 9, col 10)"
);
assert_eq!(error.get_template_name(), Some("index.html"));
assert!(error.has_template_name());
assert_eq!(error.get_line(), Some(9));
assert_eq!(error.get_col(), Some(10));
assert!(error.has_line_and_col());
assert_eq!(error.as_ref().get_message(), error.get_message());
assert_eq!(
error.source().map(ToString::to_string),
Some("writer".to_owned())
);
error.set_template_name(None);
error.set_line_and_col(-1, -1);
error.as_mut().set_line_and_col(-1, -1);
assert!(!error.has_template_name());
assert!(!error.has_line_and_col());
assert_eq!(error.to_string(), "output");
}
}