git.delta.rocks / jrsonnet / refs/commits / e23fa8691cef

difftreelog

feat std.decodeUTF8 builtin

Yaroslav Bolyukin2021-07-12parent: #00fce89.patch.diff
in: master

3 files changed

modifiedcrates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth
--- 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<Val> {
+	parse_args!(context, "decodeUTF8", args, 1, [
+		0, arr: ty!((Array<ubyte>)) => Val::Arr;
+	], {
+		let data: Result<Vec<u8>> = 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<Val> {
 	parse_args!(context, "md5", args, 1, [
 		0, str: ty!(string) => Val::Str;
modifiedcrates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth
18 filter:: $intrinsic(filter),18 filter:: $intrinsic(filter),
19 char:: $intrinsic(char),19 char:: $intrinsic(char),
20 encodeUTF8:: $intrinsic(encodeUTF8),20 encodeUTF8:: $intrinsic(encodeUTF8),
21 decodeUTF8:: $intrinsic(decodeUTF8),
21 md5:: $intrinsic(md5),22 md5:: $intrinsic(md5),
22 trace:: $intrinsic(trace),23 trace:: $intrinsic(trace),
23 id:: $intrinsic(id),24 id:: $intrinsic(id),
modifiedcrates/jrsonnet-types/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-types/src/lib.rs
+++ b/crates/jrsonnet-types/src/lib.rs
@@ -8,6 +8,9 @@
 	((Array<number>)) => {{
 		$crate::ComplexValType::ArrayRef(&$crate::ComplexValType::Simple($crate::ValType::Num))
 	}};
+	((Array<ubyte>)) => {{
+		$crate::ComplexValType::ArrayRef(&$crate::ComplexValType::BoundedNumber(Some(0.0), Some(255.0)))
+	}};
 	(array) => {
 		$crate::ComplexValType::Simple($crate::ValType::Arr)
 	};