difftreelog
fix(evaluator) utf-8 support
in: master
3 files changed
crates/jsonnet-evaluator/src/ctx.rsdiffbeforeafterboth--- a/crates/jsonnet-evaluator/src/ctx.rs
+++ b/crates/jsonnet-evaluator/src/ctx.rs
@@ -1,4 +1,4 @@
-use crate::{future_wrapper, rc_fn_helper, LazyBinding, ObjValue, LazyVal, Val};
+use crate::{future_wrapper, rc_fn_helper, LazyBinding, LazyVal, ObjValue};
use std::{cell::RefCell, collections::HashMap, fmt::Debug, rc::Rc};
rc_fn_helper!(
@@ -51,13 +51,9 @@
}
pub fn binding(&self, name: &str) -> LazyVal {
- self.0
- .bindings
- .get(name)
- .cloned()
- .unwrap_or_else(|| {
- panic!("can't find {} in {:?}", name, self);
- })
+ self.0.bindings.get(name).cloned().unwrap_or_else(|| {
+ panic!("can't find {} in {:?}", name, self);
+ })
}
pub fn into_future(self, ctx: FutureContext) -> Context {
{
crates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth1use crate::{1use crate::{2 binding, bool_val, context_creator, function_default, function_rhs, future_wrapper,2 binding, bool_val, context_creator, function_default, function_rhs, future_wrapper,3 lazy_binding, lazy_val, Binding, Context, ContextCreator, FuncDesc, LazyBinding, ObjMember,3 lazy_binding, lazy_val, Context, ContextCreator, FuncDesc, LazyBinding, ObjMember, ObjValue,4 ObjValue, Val,4 Val,5};5};6use closure::closure;6use closure::closure;284 .unwrap_or_else(|| panic!("out of bounds"))284 .unwrap_or_else(|| panic!("out of bounds"))285 .clone(),285 .clone(),286 (Val::Str(s), Val::Num(n)) => {286 (Val::Str(s), Val::Num(n)) => {287 // FIXME: Only works for ASCII288 Val::Str(String::from_utf8(vec![s.as_bytes()[n as usize]]).unwrap())287 Val::Str(s.chars().skip(n as usize - 1).take(1).collect())289 }288 }290 (v, i) => todo!("not implemented: {:?}[{:?}]", v, i.unwrap_if_lazy()),289 (v, i) => todo!("not implemented: {:?}[{:?}]", v, i.unwrap_if_lazy()),291 }290 }320 assert_eq!(args.len(), 1);319 assert_eq!(args.len(), 1);321 let expr = &args.get(0).unwrap().1;320 let expr = &args.get(0).unwrap().1;322 match evaluate(context, expr) {321 match evaluate(context, expr) {323 Val::Str(n) => Val::Num(n.len() as f64),322 Val::Str(n) => Val::Num(n.chars().count() as f64),324 Val::Arr(i) => Val::Num(i.len() as f64),323 Val::Arr(i) => Val::Num(i.len() as f64),325 v => panic!("can't get length of {:?}", v),324 v => panic!("can't get length of {:?}", v),326 }325 }349 ("std", "codepoint") => {348 ("std", "codepoint") => {350 assert_eq!(args.len(), 1);349 assert_eq!(args.len(), 1);351 if let Val::Str(s) = evaluate(context.clone(), &args[0].1) {350 if let Val::Str(s) = evaluate(context.clone(), &args[0].1) {352 // FIXME: this is not a codepoint351 assert!(352 s.chars().count() == 1,353 "std.codepoint should receive single char string"354 );353 Val::Num(s.as_bytes()[0] as f64)355 Val::Num(s.chars().take(1).next().unwrap() as u32 as f64)354 } else {356 } else {355 panic!("bad codepoint call");357 panic!("bad codepoint call");356 }358 }crates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth--- a/crates/jsonnet-evaluator/src/lib.rs
+++ b/crates/jsonnet-evaluator/src/lib.rs
@@ -68,10 +68,7 @@
}
macro_rules! assert_json_stdlib {
($str: expr, $out: expr) => {
- assert_eq!(
- format!("{}", eval_stdlib!($str)),
- $out
- )
+ assert_eq!(format!("{}", eval_stdlib!($str)), $out)
};
}
macro_rules! assert_eval_neg {
@@ -237,4 +234,12 @@
fn base64_works() {
assert_json_stdlib!(r#"std.base64("test")"#, r#""dGVzdA==""#);
}
+
+ #[test]
+ fn utf8_chars() {
+ assert_json_stdlib!(
+ r#"local c="😎";{c:std.codepoint(c),l:std.length(c)}"#,
+ r#"{"c":128526,"l":1}"#
+ )
+ }
}