difftreelog
perf make std.splitLimit builtin
in: master
2 files changed
crates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth121 ("reverse".into(), builtin_reverse),121 ("reverse".into(), builtin_reverse),122 ("id".into(), builtin_id),122 ("id".into(), builtin_id),123 ("strReplace".into(), builtin_str_replace),123 ("strReplace".into(), builtin_str_replace),124 ("splitLimit".into(), builtin_splitlimit),124 ("parseJson".into(), builtin_parse_json),125 ("parseJson".into(), builtin_parse_json),125 ].iter().cloned().collect()126 ].iter().cloned().collect()126 };127 };751 })752 })752}753}754755fn builtin_splitlimit(756 context: Context,757 _loc: Option<&ExprLocation>,758 args: &ArgsDesc,759) -> Result<Val> {760 parse_args!(context, "splitLimit", args, 3, [761 0, str: ty!(string) => Val::Str;762 1, c: ty!(char) => Val::Str;763 2, maxsplits: ty!(number) => Val::Num;764 ], {765 let maxsplits = maxsplits as isize;766 let c = c.chars().next().unwrap();767768 let out: Vec<Val> = if maxsplits == -1 {769 str.split(c).map(|s| Val::Str(s.into())).collect()770 } else {771 str.splitn(maxsplits as usize + 1, c).map(|s| Val::Str(s.into())).collect()772 };773774 Ok(Val::Arr(out.into()))775 })776}753777754pub fn call_builtin(778pub fn call_builtin(755 context: Context,779 context: Context,crates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth123 assert std.length(c) == 1 : 'std.split second parameter should have length 1, got ' + std.length(c);123 assert std.length(c) == 1 : 'std.split second parameter should have length 1, got ' + std.length(c);124 std.splitLimit(str, c, -1),124 std.splitLimit(str, c, -1),125125126 splitLimit(str, c, maxsplits)::126 splitLimit:: $intrinsic(splitLimit),127 assert std.isString(str) : 'std.splitLimit first parameter should be a string, got ' + std.type(str);128 assert std.isString(c) : 'std.splitLimit second parameter should be a string, got ' + std.type(c);129 assert std.length(c) == 1 : 'std.splitLimit second parameter should have length 1, got ' + std.length(c);130 assert std.isNumber(maxsplits) : 'std.splitLimit third parameter should be a number, got ' + std.type(maxsplits);131 local aux(str, delim, i, arr, v) =132 local c = str[i];133 local i2 = i + 1;134 if i >= std.length(str) then135 arr + [v]136 else if c == delim && (maxsplits == -1 || std.length(arr) < maxsplits) then137 aux(str, delim, i2, arr + [v], '') tailstrict138 else139 aux(str, delim, i2, arr, v + c) tailstrict;140 aux(str, c, 0, [], ''),141127142 strReplace:: $intrinsic(strReplace),128 strReplace:: $intrinsic(strReplace),143129