1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::commands::execution::{ActionExecution, ActionResult, ActionValue};
use crate::context::PicoContext;
use crate::errors::PicoError;
use crate::rules::PicoRules;
use crate::runtime::PicoRuntime;
use crate::values::PicoValue;
use tinytemplate::TinyTemplate;
#[derive(Serialize, Deserialize, Debug)]
pub struct Log {
log: String,
}
impl ActionExecution for Log {
fn run_with_context(
&self,
_pico_rules: &PicoRules,
_runtime: &mut PicoRuntime,
_ctx: &mut PicoContext,
) -> ActionResult {
info!("MSG: {:?}", self.log);
Ok(ActionValue::Continue)
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct DebugLog {
debug: String,
#[serde(default = "DebugLog::default_tt", skip)]
tt: String,
}
impl DebugLog {
fn default_tt() -> String {
"TTT".to_string()
}
}
impl ActionExecution for DebugLog {
fn run_with_context(
&self,
_pico_rules: &PicoRules,
_runtime: &mut PicoRuntime,
ctx: &mut PicoContext,
) -> ActionResult {
let mut tt = TinyTemplate::new();
trace!("Building tiny template");
match tt.add_template("debug", &self.debug) {
Err(e) => {
error!("template failure: {:?}", e);
return Err(PicoError::Crash("Template failure".to_string()));
}
Ok(_) => {}
}
let c = ctx.variables.clone();
let l = ctx.local_variables.clone();
let k: HashMap<String, PicoValue> = l.into_iter().chain(c).collect();
let rendered = tt.render("debug", &k);
trace!("MSG: {:?}, variables: {:#?}", self.debug, &ctx.variables);
match rendered {
Ok(val) => debug!("tmpl[{:?}]: {:?}", self.tt, val),
Err(e) => error!("{:?}", e),
}
Ok(ActionValue::Continue)
}
}