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}