summaryrefslogtreecommitdiffstats
path: root/src/package/script.rs
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-12-14 09:45:51 +0100
committerMatthias Beyer <mail@beyermatthias.de>2020-12-14 09:45:52 +0100
commitfaa5f98c7f447d77ab8ed0d2e95c4106441cf53b (patch)
tree4e0b85d8a575bc55fac64b914da4ea2ee4a75fc4 /src/package/script.rs
parentc97a53a2e7e4d9cfa301b308e9b090d06894925b (diff)
Add script helpers: join, joinwith
This adds two script helpers to join lists of strings. They do not support arrays. Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/package/script.rs')
-rw-r--r--src/package/script.rs48
1 files changed, 47 insertions, 1 deletions
diff --git a/src/package/script.rs b/src/package/script.rs
index 42e80a6..a5075dc 100644
--- a/src/package/script.rs
+++ b/src/package/script.rs
@@ -4,7 +4,7 @@ use anyhow::Error;
use anyhow::Context as AnyhowContext;
use anyhow::Result;
use anyhow::anyhow;
-use handlebars::{Handlebars, HelperDef, RenderContext, Helper, Context, JsonRender, HelperResult, Output, RenderError};
+use handlebars::{Handlebars, HelperDef, RenderContext, Helper, Context, JsonRender, HelperResult, Output, RenderError, PathAndJson};
use log::trace;
use serde::Deserialize;
use serde::Serialize;
@@ -206,6 +206,8 @@ impl<'a> ScriptBuilder<'a> {
hb.register_helper("phase", Box::new(PhaseHelper));
hb.register_helper("state", Box::new(StateHelper));
hb.register_helper("progress", Box::new(ProgressHelper));
+ hb.register_helper("join", Box::new(JoinHelper));
+ hb.register_helper("joinwith", Box::new(JoinWithHelper));
hb.set_strict_mode(strict_mode);
hb.render("script", package).map_err(Error::from)
}
@@ -276,3 +278,47 @@ impl HelperDef for ProgressHelper {
}
}
+#[derive(Clone, Copy)]
+struct JoinHelper;
+
+impl HelperDef for JoinHelper {
+ fn call<'reg: 'rc, 'rc>(&self, h: &Helper, _: &Handlebars, _: &Context, _rc: &mut RenderContext, out: &mut dyn Output) -> HelperResult {
+ joinstrs("", h.params().iter(), out)
+ }
+}
+
+#[derive(Clone, Copy)]
+struct JoinWithHelper;
+
+impl HelperDef for JoinWithHelper {
+ fn call<'reg: 'rc, 'rc>(&self, h: &Helper, _: &Handlebars, _: &Context, _rc: &mut RenderContext, out: &mut dyn Output) -> HelperResult {
+ let joiner = h.param(0)
+ .ok_or_else(|| RenderError::new("Required parameter missing: Join string"))?
+ .value()
+ .as_str()
+ .ok_or_else(|| RenderError::new("Required parameter must be a string: joinstr"))?;
+
+ joinstrs(joiner, h.params().iter().skip(1), out)
+ }
+}
+
+fn joinstrs<'reg: 'rc, 'rc, I>(with: &str, params: I, out: &mut dyn Output) -> HelperResult
+ where I: Iterator<Item = &'rc PathAndJson<'reg, 'rc>>
+{
+ use std::result::Result as RResult;
+ use itertools::Itertools;
+
+ let s = params
+ .map(|p| {
+ p.value()
+ .as_str()
+ .ok_or_else(|| RenderError::new("All parameters must be string"))
+ })
+ .collect::<RResult<Vec<&str>, RenderError>>()?
+ .into_iter()
+ .join(with);
+
+ out.write(&s)?;
+ Ok(())
+}
+