From 7877328255d56034ed9d68b8455836b7d7218c27 Mon Sep 17 00:00:00 2001 From: Anand Krishnamoorthi Date: Sat, 25 Apr 2026 17:43:53 -0500 Subject: [PATCH] feat: add strings.repeat builtin Adds strings.repeat(s, count) which repeats string s count times. Example: strings.repeat("ab", 3) returns "ababab" --- src/builtins/strings.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/builtins/strings.rs b/src/builtins/strings.rs index fad73095..54d0bb8c 100644 --- a/src/builtins/strings.rs +++ b/src/builtins/strings.rs @@ -36,6 +36,7 @@ pub fn register(m: &mut builtins::BuiltinsMap<&'static str, builtins::BuiltinFcn m.insert("strings.any_suffix_match", (any_suffix_match, 2)); m.insert("strings.count", (strings_count, 2)); m.insert("strings.replace_n", (replace_n, 2)); + m.insert("strings.repeat", (repeat, 2)); m.insert("strings.reverse", (reverse, 1)); m.insert("substring", (substring, 3)); m.insert("trim", (trim, 2)); @@ -591,6 +592,25 @@ fn reverse(span: &Span, params: &[Ref], args: &[Value], _strict: bool) -> Ok(Value::String(s.chars().rev().collect::().into())) } +fn repeat(span: &Span, params: &[Ref], args: &[Value], _strict: bool) -> Result { + let name = "strings.repeat"; + ensure_args_count(span, name, params, args, 2)?; + + let s = ensure_string(name, ¶ms[0], &args[0])?; + let count = args[1].as_f64().unwrap() as usize; + + if count == 0 { + return Ok(Value::String("".into())); + } + + let mut result = String::new(); + for _ in 0..count { + result.push_str(&s); + } + + Ok(Value::String(result.into())) +} + fn substring(span: &Span, params: &[Ref], args: &[Value], strict: bool) -> Result { let name = "substring"; ensure_args_count(span, name, params, args, 3)?;