diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-12-14 09:45:51 +0100 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-12-14 09:45:52 +0100 |
commit | faa5f98c7f447d77ab8ed0d2e95c4106441cf53b (patch) | |
tree | 4e0b85d8a575bc55fac64b914da4ea2ee4a75fc4 /src/package/script.rs | |
parent | c97a53a2e7e4d9cfa301b308e9b090d06894925b (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.rs | 48 |
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(()) +} + |