Skip to main content

mumustring/partial/
join.rs

1use mumu::parser::types::Value;
2use crate::common::{is_placeholder, make_two_arg_partial};
3
4pub fn string_join_bridge(_interp: &mut mumu::parser::interpreter::Interpreter, args: Vec<Value>) -> Result<Value, String> {
5    match args.len() {
6        0 => Ok(make_two_arg_partial(string_join_finalize, None, None)),
7        1 => Ok(make_two_arg_partial(string_join_finalize, Some(args[0].clone()), None)),
8        2 => {
9            let sep = &args[0];
10            let arr = &args[1];
11            let sep_is_pl = is_placeholder(sep);
12            let arr_is_pl = is_placeholder(arr);
13
14            if !sep_is_pl && !arr_is_pl {
15                string_join_finalize(vec![sep.clone(), arr.clone()])
16            } else {
17                Ok(make_two_arg_partial(
18                    string_join_finalize,
19                    if sep_is_pl { None } else { Some(sep.clone()) },
20                    if arr_is_pl { None } else { Some(arr.clone()) },
21                ))
22            }
23        }
24        n => Err(format!("string:join => expected up to 2 arguments, got {}", n)),
25    }
26}
27
28fn string_join_finalize(mut args: Vec<Value>) -> Result<Value, String> {
29    if args.len() != 2 {
30        return Err(format!("string:join => finalize => expected 2 real args, got {}", args.len()));
31    }
32    let sep_val = args.remove(0);
33    let arr_val = args.remove(0);
34    let arr = match arr_val {
35        Value::StrArray(ss) => ss,
36        other => return Err(format!("string:join => second arg (array) must be StrArray, got {:?}", other)),
37    };
38    let sep = match sep_val {
39        Value::SingleString(s) => s,
40        Value::StrArray(ss) if ss.len() == 1 => ss[0].clone(),
41        other => return Err(format!("string:join => first arg (sep) must be string, got {:?}", other)),
42    };
43    Ok(Value::SingleString(arr.join(&sep)))
44}