bracket/error/
helper.rs

1//! Errors generated when calling helpers.
2//!
3//! The renderer will wrap these in `RenderError` so you only
4//! need to use this type when implementing helpers.
5use crate::error::{render::RenderError, syntax::SyntaxError, IoError};
6use thiserror::Error;
7
8/// Errors generated by helpers.
9#[derive(Error, Debug)]
10pub enum HelperError {
11    /// Generic error message for helpers.
12    #[error("{0}")]
13    Message(String),
14    /// Error when asserting that a helper expects an inner template.
15    #[error("Helper '{0}' expects a block template")]
16    BlockTemplate(String),
17    /// Error when asserting that a helper does not allow an inner template.
18    #[error("Helper '{0}' does not allow a block template")]
19    BlockTemplateNotAllowed(String),
20    /// Error when supplied arguments do not match an exact arity.
21    #[error("Helper '{0}' got invalid arity expects {1} arguments(s)")]
22    ArityExact(String, usize),
23    /// Error when supplied arguments do not match an arity range.
24    #[error("Helper '{0}' got invalid arity expects {1}-{2} argument(s)")]
25    ArityRange(String, usize, usize),
26    /// Error when a helper expects a string argument.
27    #[error("Helper '{0}' got invalid argument at index {1}, string expected")]
28    ArgumentTypeString(String, usize),
29
30    /*
31    /// Error when a helper expects an iterable (object or array).
32    #[error("Helper '{0}' got invalid argument at index {1}, expected array or object")]
33    IterableExpected(String, usize),
34    */
35    /// Error when a field could not be resolved.
36    #[error("Helper '{0}' failed to resolve field '{1}'")]
37    LookupField(String, String),
38
39    /// Error when the operand to a numerical helper is invalid (not a number).
40    #[error("Helper '{0}' got invalid numerical operand")]
41    InvalidNumericalOperand(String),
42
43    /// Error when a type assertion fails,
44    #[error(
45        "Helper '{0}' type assertion failed, expected '{1}' but got '{2}'"
46    )]
47    TypeAssert(String, String, String),
48
49    /// Proxy for syntax errors that occur via helpers.
50    ///
51    /// For example when dynamically evaluating paths passed to
52    /// the `evaluate()` function.
53    #[error(transparent)]
54    Syntax(#[from] SyntaxError),
55
56    /// Proxy for render errors that occur via helpers; for example
57    /// when rendering inner templates.
58    #[error(transparent)]
59    Render(#[from] Box<RenderError>),
60
61    /// Proxy I/O errors.
62    #[error(transparent)]
63    Io(#[from] IoError),
64
65    /// Proxy JSON errors.
66    #[error(transparent)]
67    Json(#[from] serde_json::Error),
68}
69
70impl HelperError {
71    /// Create a new helper error with the given message.
72    pub fn new<S: AsRef<str>>(msg: S) -> Self {
73        HelperError::Message(msg.as_ref().to_string())
74    }
75}
76
77impl From<std::io::Error> for HelperError {
78    fn from(err: std::io::Error) -> Self {
79        Self::Io(IoError::Io(err))
80    }
81}