From 02b7991d635925e8c3d65571060ae13dbc231ddf Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Mon, 12 Jul 2021 17:20:24 +0000 Subject: [PATCH] perf: make std.substr builtin --- --- a/crates/jrsonnet-evaluator/src/builtin/mod.rs +++ b/crates/jrsonnet-evaluator/src/builtin/mod.rs @@ -81,6 +81,7 @@ ("objectFieldsEx".into(), builtin_object_fields_ex), ("objectHasEx".into(), builtin_object_has_ex), ("slice".into(), builtin_slice), + ("substr".into(), builtin_substr), ("primitiveEquals".into(), builtin_primitive_equals), ("equals".into(), builtin_equals), ("modulo".into(), builtin_modulo), @@ -241,6 +242,17 @@ }) } +fn builtin_substr(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result { + parse_args!(context, "substr", args, 3, [ + 0, str: ty!(string) => Val::Str; + 1, from: ty!(BoundedNumber<(Some(0.0)), (None)>) => Val::Num; + 2, len: ty!(BoundedNumber<(Some(0.0)), (None)>) => Val::Num; + ], { + let out: String = str.chars().skip(from as usize).take(len as usize).collect(); + Ok(Val::Str(out.into())) + }) +} + fn builtin_primitive_equals( context: Context, _loc: Option<&ExprLocation>, --- a/crates/jrsonnet-stdlib/src/std.jsonnet +++ b/crates/jrsonnet-stdlib/src/std.jsonnet @@ -48,12 +48,7 @@ toString(a):: if std.type(a) == 'string' then a else '' + a, - substr(str, from, len):: - assert std.isString(str) : 'substr first parameter should be a string, got ' + std.type(str); - assert std.isNumber(from) : 'substr second parameter should be a string, got ' + std.type(from); - assert std.isNumber(len) : 'substr third parameter should be a string, got ' + std.type(len); - assert len >= 0 : 'substr third parameter should be greater than zero, got ' + len; - std.join('', std.makeArray(std.max(0, std.min(len, std.length(str) - from)), function(i) str[i + from])), + substr:: $intrinsic(substr), startsWith(a, b):: if std.length(a) < std.length(b) then -- gitstuff