codegenr_lib/helpers/
regex.rs

1use crate::helpers::handlebars_ext::HandlebarsExt;
2use crate::helpers::string_ext::StringExt;
3use handlebars::{HelperDef, RenderError};
4use serde_json::Value;
5
6pub const REGEX_EXTRACT_HELPER: &str = "regex_extract";
7pub const REGEX_TRANSFORM_HELPER: &str = "regex_transform";
8
9/// Extract and transform a list of values with regex.
10///```
11/// # use codegenr_lib::helpers::*;
12/// # use serde_json::json;
13/// assert_eq!(
14///   exec_template(json!({"test": "/user/{username}"}), r#"{{regex_extract test "\\{([^}]*)}" "$1"}}"#),
15///   "username"
16/// );
17/// assert_eq!(
18///   exec_template(json!({"test": "/user/{username}/{id}"}), r#"{{regex_extract test "\\{([^}]*)}" "$1"}}"#),
19///   "username, id"
20/// );
21/// assert_eq!(
22///   exec_template(json!({"test": "/user/{username}/{id}"}), r#"{{regex_extract test "\\{([^}]*)}" "<$1>" "|" }}"#),
23///   "<username>|<id>"
24/// );
25///```
26pub struct RegexExtractHelper;
27
28impl HelperDef for RegexExtractHelper {
29  fn call_inner<'reg: 'rc, 'rc>(
30    &self,
31    h: &handlebars::Helper<'reg, 'rc>,
32    _: &'reg handlebars::Handlebars<'reg>,
33    _: &'rc handlebars::Context,
34    _: &mut handlebars::RenderContext<'reg, 'rc>,
35  ) -> Result<handlebars::ScopedJson<'reg, 'rc>, handlebars::RenderError> {
36    let arg = h.get_param_as_str_or_fail(0, REGEX_EXTRACT_HELPER)?;
37    let regex_pattern = h.get_param_as_str_or_fail(1, REGEX_EXTRACT_HELPER)?;
38    let regex_replacer = h.get_param_as_str_or_fail(2, REGEX_EXTRACT_HELPER)?;
39    let separator = h.get_param_as_str(3);
40    let result = arg
41      .regex_extract(regex_pattern, Some(regex_replacer), separator)
42      .map_err(|e| RenderError::new(format!("{} error: `{}`.", REGEX_EXTRACT_HELPER, e)))?;
43    Ok(handlebars::ScopedJson::Derived(Value::String(result)))
44  }
45}
46
47/// Extract and transform a list of values.
48///```
49/// # use codegenr_lib::helpers::*;
50/// # use serde_json::json;
51/// assert_eq!(
52///   exec_template(json!({"test": "/user/{username}"}), r#"{{regex_transform test "\\{([^}]*)}" "$1"}}"#),
53///   "/user/username"
54/// );
55/// assert_eq!(
56///   exec_template(json!({"test": "/user/{username}/{id}"}), r#"{{regex_transform test "\\{([^}]*)}" "$1"}}"#),
57///   "/user/username/id"
58/// );
59/// assert_eq!(
60///   exec_template(json!({"test": "/user/{username}/{id}"}), r#"{{regex_transform test "\\{([^}]*)}" "<$1>" "|" }}"#),
61///   "/user/<username>/<id>"
62/// );
63///```
64pub struct RegexTransformHelper;
65
66impl HelperDef for RegexTransformHelper {
67  fn call_inner<'reg: 'rc, 'rc>(
68    &self,
69    h: &handlebars::Helper<'reg, 'rc>,
70    _: &'reg handlebars::Handlebars<'reg>,
71    _: &'rc handlebars::Context,
72    _: &mut handlebars::RenderContext<'reg, 'rc>,
73  ) -> Result<handlebars::ScopedJson<'reg, 'rc>, handlebars::RenderError> {
74    let arg = h.get_param_as_str_or_fail(0, REGEX_TRANSFORM_HELPER)?;
75    let regex_pattern = h.get_param_as_str_or_fail(1, REGEX_TRANSFORM_HELPER)?;
76    let regex_replacer = h.get_param_as_str_or_fail(2, REGEX_TRANSFORM_HELPER)?;
77    let result = arg
78      .regex_transform(regex_pattern, regex_replacer)
79      .map_err(|e| RenderError::new(format!("{} error: `{}`.", REGEX_TRANSFORM_HELPER, e)))?;
80    Ok(handlebars::ScopedJson::Derived(Value::String(result)))
81  }
82}