bracket/helper/
log.rs

1//! Helper to print log messages.
2use crate::{
3    helper::{Helper, HelperValue},
4    json,
5    parser::ast::Node,
6    render::{Context, Render},
7};
8
9use log::*;
10
11/// Print a log message.
12///
13/// Multiple arguments are accepted and concatenated using a
14/// space before being sent to the log output.
15///
16/// Values are coerced to strings before concatenation with
17/// special handling for `Value::String` so that it is not quoted.
18///
19/// Use the `level` hash parameter to set the log level to one of:
20///
21/// * trace
22/// * debug
23/// * info
24/// * warn
25/// * error
26///
27pub struct Log;
28
29impl Helper for Log {
30    fn call<'render, 'call>(
31        &self,
32        _rc: &mut Render<'render>,
33        ctx: &Context<'call>,
34        _template: Option<&'render Node<'render>>,
35    ) -> HelperValue {
36        ctx.arity(1..usize::MAX)?;
37
38        let message = ctx
39            .arguments()
40            .iter()
41            .map(|v| json::unquote(v))
42            .collect::<Vec<String>>()
43            .join(" ");
44
45        let level = ctx
46            .param("level")
47            .map(|v| v.as_str())
48            .unwrap_or(Some("info"))
49            .unwrap();
50
51        let lines = message.split("\n");
52        for line in lines {
53            match level {
54                "error" => error!("{}", line),
55                "debug" => debug!("{}", line),
56                "warn" => warn!("{}", line),
57                "trace" => trace!("{}", line),
58                _ => info!("{}", line),
59            }
60        }
61
62        Ok(None)
63    }
64}