From 4a1c9d0032c1d5e50d522c444e7320ff18c4806a Mon Sep 17 00:00:00 2001 From: Лач Date: Fri, 26 Jun 2020 12:14:31 +0000 Subject: [PATCH] fix(evaluator): add missing intristics: char, encodeUTF8, md5 --- --- a/crates/jsonnet-evaluator/Cargo.toml +++ b/crates/jsonnet-evaluator/Cargo.toml @@ -18,6 +18,7 @@ closure = "0.3.0" jsonnet-stdlib = { path = "../jsonnet-stdlib" } indexmap = "1.4.0" +md5 = "0.7.0" [dependencies.serde] version = "1.0.114" --- a/crates/jsonnet-evaluator/src/evaluate.rs +++ b/crates/jsonnet-evaluator/src/evaluate.rs @@ -682,6 +682,29 @@ panic!("bad filter call"); } } + ("std", "char") => { + assert_eq!(args.len(), 1); + let ch = evaluate(context, &args[0].1)? + .unwrap_if_lazy()? + .try_cast_num("std.char first argument")?; + let mut out = String::new(); + out.push(std::char::from_u32(ch as u32).unwrap()); + Val::Str(out.into()) + } + ("std", "encodeUTF8") => { + assert_eq!(args.len(), 1); + let s = evaluate(context, &args[0].1)? + .unwrap_if_lazy()? + .try_cast_str("std.encodeUTF8 first argument")?; + Val::Arr(Rc::new(s.bytes().map(|b| Val::Num(b as f64)).collect())) + } + ("std", "md5") => { + assert_eq!(args.len(), 1); + let s = evaluate(context, &args[0].1)? + .unwrap_if_lazy()? + .try_cast_str("std.md5 first argument")?; + Val::Str(format!("{:x}", md5::compute(s.as_bytes())).into()) + } // faster ("std", "join") => { assert_eq!(args.len(), 2); --- a/crates/jsonnet-evaluator/src/val.rs +++ b/crates/jsonnet-evaluator/src/val.rs @@ -150,6 +150,10 @@ self.assert_type(context, ValType::Str)?; Ok(matches_unwrap!(self.unwrap_if_lazy()?, Val::Str(v), v)) } + pub fn try_cast_num(self, context: &'static str) -> Result { + self.assert_type(context, ValType::Num)?; + Ok(matches_unwrap!(self.unwrap_if_lazy()?, Val::Num(v), v)) + } pub fn unwrap_if_lazy(&self) -> Result { Ok(if let Val::Lazy(v) = self { v.evaluate()?.unwrap_if_lazy()? -- gitstuff