mumustring/partial/
split.rs1use mumu::parser::types::Value;
2use crate::common::{is_placeholder, make_two_arg_partial};
3
4pub fn string_split_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_split_finalize, None, None)),
7 1 => Ok(make_two_arg_partial(string_split_finalize, Some(args[0].clone()), None)),
8 2 => {
9 let sep = &args[0];
10 let s = &args[1];
11 let sep_is_pl = is_placeholder(sep);
12 let s_is_pl = is_placeholder(s);
13
14 if !sep_is_pl && !s_is_pl {
15 string_split_finalize(vec![sep.clone(), s.clone()])
16 } else {
17 Ok(make_two_arg_partial(
18 string_split_finalize,
19 if sep_is_pl { None } else { Some(sep.clone()) },
20 if s_is_pl { None } else { Some(s.clone()) },
21 ))
22 }
23 }
24 n => Err(format!("string:split => expected up to 2 arguments, got {}", n)),
25 }
26}
27
28fn string_split_finalize(mut args: Vec<Value>) -> Result<Value, String> {
29 if args.len() != 2 {
30 return Err(format!(
31 "string:split => finalize => expected 2 real args, got {}",
32 args.len()
33 ));
34 }
35 let sep = args.remove(0);
36 let data = args.remove(0);
37 let s = match data {
38 Value::SingleString(s) => s,
39 Value::StrArray(ss) if ss.len() == 1 => ss[0].clone(),
40 other => return Err(format!("string:split => second arg (string) must be a single string, got {:?}", other)),
41 };
42 let sep_s = match sep {
43 Value::SingleString(s) => s,
44 Value::StrArray(ss) if ss.len() == 1 => ss[0].clone(),
45 other => return Err(format!("string:split => first arg (sep) must be a single string, got {:?}", other)),
46 };
47 let parts: Vec<String> = if sep_s.is_empty() {
48 s.chars().map(|c| c.to_string()).collect()
49 } else {
50 s.split(&sep_s).map(|p| p.to_string()).collect()
51 };
52 Ok(Value::StrArray(parts))
53}