aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Pasquet <dev@etenil.net>2022-03-19 09:56:51 +0000
committerGuillaume Pasquet <dev@etenil.net>2022-03-19 09:56:51 +0000
commitace1973b3a291a4c09485373f8574ecde3ee229b (patch)
treeb3fa5e6ac55ca4fb3dc2b328c6a2e83d2c4586df
parente2b8352d597a1e52db99abf3dc822f25428f7ea0 (diff)
Fix #13 - Implement default values for placeholders
-rw-r--r--README.md1
-rw-r--r--src/executor.rs50
2 files changed, 47 insertions, 4 deletions
diff --git a/README.md b/README.md
index 5af2e03..37d950a 100644
--- a/README.md
+++ b/README.md
@@ -136,6 +136,7 @@ Barb can include environment variable values and variables defined in `.env` int
```
{VARIABLE NAME}
+{VARIABLE NAME:-DEFAULT}
```
This allows to do the following:
diff --git a/src/executor.rs b/src/executor.rs
index 54ca491..763b0e6 100644
--- a/src/executor.rs
+++ b/src/executor.rs
@@ -29,19 +29,29 @@ impl Context {
}
}
+ #[cfg(test)]
fn key_str(&self, key: &String) -> String {
+ // Use for reference / utility?
format!("{{{}}}", key)
}
pub fn substitute(&self, string: &String) -> String {
let mut buffer = string.clone();
- let re = Regex::new(r"\{([A-Za-z0-9_]+)\}").unwrap();
+ let re = Regex::new(r"\{(?P<key>[A-Za-z0-9_]+)(?::-(?P<value>.*))?\}").unwrap();
for var in re.captures_iter(string) {
- let key = String::from(&var[1]);
+ let key = String::from(&var["key"]);
+ let value = String::from(
+ var.name("value")
+ .map(|m| m.as_str())
+ .or(Some(&String::from(""))).unwrap()
+ );
+
buffer = buffer.replace(
- self.key_str(&key).as_str(),
- self.vars.get(&key).or(Some(&String::from(""))).unwrap(),
+ // Since this iterates over matches, having match 0 is guaranteed. So the
+ // `unwrap()` operation here is safe.
+ var.get(0).unwrap().as_str(),
+ self.vars.get(&key).or(Some(&value)).unwrap()
);
}
@@ -197,6 +207,38 @@ mod tests_context {
String::from("blah blah blah")
);
}
+
+ #[test]
+ fn test_context_substitute_default() {
+ let vars: Vec<(String, String)> = vec![];
+ let ctx = Context::new(vars.into_iter());
+ assert_eq!(
+ ctx.substitute(&String::from("blah blah {chewie:-wookie} blah")),
+ String::from("blah blah wookie blah")
+ );
+ }
+
+ #[test]
+ fn test_context_substitute_value_with_default() {
+ let vars: Vec<(String, String)> = vec![
+ (String::from("chewie"), String::from("han")),
+ ];
+ let ctx = Context::new(vars.into_iter());
+ assert_eq!(
+ ctx.substitute(&String::from("blah blah {chewie:-wookie} blah")),
+ String::from("blah blah han blah")
+ );
+ }
+
+ #[test]
+ fn test_context_substitute_empty_default() {
+ let vars: Vec<(String, String)> = vec![];
+ let ctx = Context::new(vars.into_iter());
+ assert_eq!(
+ ctx.substitute(&String::from("blah blah {chewie:-} blah")),
+ String::from("blah blah blah")
+ );
+ }
}
#[cfg(test)]