Skip to content

Commit

Permalink
Add comma and group transformers
Browse files Browse the repository at this point in the history
  • Loading branch information
Atreyagaurav committed Nov 1, 2023
1 parent 9755cc2 commit 5029822
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "string-template-plus"
version = "0.3.6"
version = "0.3.7"
edition = "2021"
authors = ["Gaurav Atreya"]
description = "Render string template with more options"
Expand Down
93 changes: 93 additions & 0 deletions src/transformers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ pub fn apply_tranformers(val: &str, transformations: &str) -> Result<String, Tra
"repl" => replace(&val, args)?,
"take" => take(&val, args)?,
"trim" => trim(&val, args)?,
"comma" => comma(&val, args)?,
"group" => group(&val, args)?,
"q" => quote(&val, args)?,
_ => {
return Err(TransformerError::UnknownTranformer(
Expand Down Expand Up @@ -342,6 +344,97 @@ pub fn trim(val: &str, args: Vec<&str>) -> Result<String, TransformerError> {
Ok(val.to_string())
}

/// Insert commas to the given string in provided positions
///
///
/// ```rust
/// # use std::error::Error;
/// # use string_template_plus::transformers::*;
/// #
/// # fn main() -> Result<(), Box<dyn Error>> {
/// assert_eq!(comma("1234", vec!["3"])?, "1,234");
/// assert_eq!(comma("1234567", vec!["3"])?, "1,234,567");
/// assert_eq!(comma("1234567", vec!["3", "2"])?, "12,34,567");
/// assert_eq!(comma("91234567", vec!["3", "2"])?, "9,12,34,567");
/// # Ok(())
/// # }
pub fn comma(val: &str, args: Vec<&str>) -> Result<String, TransformerError> {
let func_name = "comma";
check_arguments_len(func_name, 1.., args.len())?;
let mut args: Vec<usize> = args
.iter()
.map(|s| {
s.parse().map_err(|_| {
TransformerError::InvalidArgumentType(func_name, s.to_string(), "uint")
})
})
.rev()
.collect::<Result<Vec<usize>, TransformerError>>()?;
let last = args[0];
let mut i = args.pop().unwrap();

let mut result = vec![];
let val: Vec<char> = val.replace(',', "").chars().rev().collect();
for c in val {
if i == 0 {
i = args.pop().unwrap_or(last);
result.push(',');
}
result.push(c);
i -= 1;
}
result.reverse();
let result: String = result.into_iter().collect();
Ok(result)
}

/// Insert characters to the given string in provided positions
///
///
/// ```rust
/// # use std::error::Error;
/// # use string_template_plus::transformers::*;
/// #
/// # fn main() -> Result<(), Box<dyn Error>> {
/// assert_eq!(group("1234", vec![",", "3"])?, "1,234");
/// assert_eq!(group("1234567", vec!["_", "3"])?, "1_234_567");
/// assert_eq!(group("1234567", vec![", ", "3", "2"])?, "12, 34, 567");
/// assert_eq!(group("91234567", vec!["_", "3", "2"])?, "9_12_34_567");
/// # Ok(())
/// # }
pub fn group(val: &str, args: Vec<&str>) -> Result<String, TransformerError> {
let func_name = "group";
check_arguments_len(func_name, 2.., args.len())?;
let sep = args[0];
let mut args: Vec<usize> = args[1..]
.iter()
.map(|s| {
s.parse().map_err(|_| {
TransformerError::InvalidArgumentType(func_name, s.to_string(), "uint")
})
})
.rev()
.collect::<Result<Vec<usize>, TransformerError>>()?;
let last = args[0];
let mut i = args.pop().unwrap();

let mut result = vec![];
let val: Vec<char> = val.replace(sep, "").chars().rev().collect();
for c in val {
if i == 0 {
i = args.pop().unwrap_or(last);
for c in sep.chars().rev() {
result.push(c);
}
}
result.push(c);
i -= 1;
}
result.reverse();
let result: String = result.into_iter().collect();
Ok(result)
}

/// Quote the text with given strings or `""`
///
/// ```rust
Expand Down

0 comments on commit 5029822

Please sign in to comment.