--- a/crates/jrsonnet-evaluator/src/builtin/mod.rs +++ b/crates/jrsonnet-evaluator/src/builtin/mod.rs @@ -112,6 +112,7 @@ ("range".into(), builtin_range), ("char".into(), builtin_char), ("encodeUTF8".into(), builtin_encode_utf8), + ("decodeUTF8".into(), builtin_decode_utf8), ("md5".into(), builtin_md5), ("base64".into(), builtin_base64), ("base64DecodeBytes".into(), builtin_base64_decode_bytes), @@ -585,6 +586,23 @@ }) } +fn builtin_decode_utf8( + context: Context, + _loc: Option<&ExprLocation>, + args: &ArgsDesc, +) -> Result { + parse_args!(context, "decodeUTF8", args, 1, [ + 0, arr: ty!((Array)) => Val::Arr; + ], { + let data: Result> = arr.iter().map(|v| v.map(|v| match v{ + Val::Num(n) => n as u8, + _ => unreachable!(), + })).collect(); + let data = data?; + Ok(Val::Str(String::from_utf8(data).map_err(|_| RuntimeError("bad utf8".into()))?.into())) + }) +} + fn builtin_md5(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result { parse_args!(context, "md5", args, 1, [ 0, str: ty!(string) => Val::Str; --- a/crates/jrsonnet-stdlib/src/std.jsonnet +++ b/crates/jrsonnet-stdlib/src/std.jsonnet @@ -18,6 +18,7 @@ filter:: $intrinsic(filter), char:: $intrinsic(char), encodeUTF8:: $intrinsic(encodeUTF8), + decodeUTF8:: $intrinsic(decodeUTF8), md5:: $intrinsic(md5), trace:: $intrinsic(trace), id:: $intrinsic(id), --- a/crates/jrsonnet-types/src/lib.rs +++ b/crates/jrsonnet-types/src/lib.rs @@ -8,6 +8,9 @@ ((Array)) => {{ $crate::ComplexValType::ArrayRef(&$crate::ComplexValType::Simple($crate::ValType::Num)) }}; + ((Array)) => {{ + $crate::ComplexValType::ArrayRef(&$crate::ComplexValType::BoundedNumber(Some(0.0), Some(255.0))) + }}; (array) => { $crate::ComplexValType::Simple($crate::ValType::Arr) };