handlebars/helpers/
helper_log.rs
1use crate::context::Context;
2use crate::helpers::{HelperDef, HelperResult};
3#[cfg(not(feature = "no_logging"))]
4use crate::json::value::JsonRender;
5use crate::output::Output;
6use crate::registry::Registry;
7use crate::render::{Helper, RenderContext};
8#[cfg(not(feature = "no_logging"))]
9use crate::RenderErrorReason;
10#[cfg(not(feature = "no_logging"))]
11use log::Level;
12#[cfg(not(feature = "no_logging"))]
13use std::str::FromStr;
14
15#[derive(Clone, Copy)]
16pub struct LogHelper;
17
18#[cfg(not(feature = "no_logging"))]
19impl HelperDef for LogHelper {
20 fn call<'reg: 'rc, 'rc>(
21 &self,
22 h: &Helper<'rc>,
23 _: &'reg Registry<'reg>,
24 _: &'rc Context,
25 _: &mut RenderContext<'reg, 'rc>,
26 _: &mut dyn Output,
27 ) -> HelperResult {
28 let param_to_log = h
29 .params()
30 .iter()
31 .map(|p| {
32 if let Some(relative_path) = p.relative_path() {
33 format!("{}: {}", &relative_path, p.value().render())
34 } else {
35 p.value().render()
36 }
37 })
38 .collect::<Vec<String>>()
39 .join(", ");
40
41 let level = h
42 .hash_get("level")
43 .and_then(|v| v.value().as_str())
44 .unwrap_or("info");
45
46 if let Ok(log_level) = Level::from_str(level) {
47 log!(log_level, "{}", param_to_log);
48 } else {
49 return Err(RenderErrorReason::InvalidLoggingLevel(level.to_string()).into());
50 }
51 Ok(())
52 }
53}
54
55#[cfg(feature = "no_logging")]
56impl HelperDef for LogHelper {
57 fn call<'reg: 'rc, 'rc>(
58 &self,
59 _: &Helper<'rc>,
60 _: &Registry<'reg>,
61 _: &Context,
62 _: &mut RenderContext<'reg, 'rc>,
63 _: &mut dyn Output,
64 ) -> HelperResult {
65 Ok(())
66 }
67}
68
69pub static LOG_HELPER: LogHelper = LogHelper;
70
71#[cfg(test)]
72mod test {
73 use crate::registry::Registry;
74
75 #[test]
76 #[cfg(not(feature = "no_logging"))]
77 fn test_log_helper() {
78 let mut handlebars = Registry::new();
79 assert!(handlebars
80 .register_template_string("t0", "{{log this level=\"warn\"}}")
81 .is_ok());
82 assert!(handlebars
83 .register_template_string("t1", "{{log this level=\"hello\"}}")
84 .is_ok());
85 assert!(handlebars
86 .register_template_string("t2", "{{log this}}")
87 .is_ok());
88
89 let r0 = handlebars.render("t0", &true);
90 assert!(r0.is_ok());
91
92 let r1 = handlebars.render("t1", &true);
93 assert!(r1.is_err());
94
95 let r2 = handlebars.render("t2", &true);
96 assert!(r2.is_ok());
97 }
98
99 #[test]
100 #[cfg(feature = "no_logging")]
101 fn test_log_helper() {
102 let mut handlebars = Registry::new();
103 assert!(handlebars
104 .register_template_string("t0", "{{log this level=\"warn\"}}")
105 .is_ok());
106 assert!(handlebars
107 .register_template_string("t1", "{{log this level=\"hello\"}}")
108 .is_ok());
109 assert!(handlebars
110 .register_template_string("t2", "{{log this}}")
111 .is_ok());
112
113 let r0 = handlebars.render("t0", &true);
114 assert!(r0.is_ok());
115
116 let r1 = handlebars.render("t1", &true);
117 assert!(r1.is_ok());
118
119 let r2 = handlebars.render("t2", &true);
120 assert!(r2.is_ok());
121 }
122}