git.delta.rocks / jrsonnet / refs/commits / 64fb3950ee00

difftreelog

fix(evaluator) utf-8 support

Лач2020-05-31parent: #26c294d.patch.diff
in: master

3 files changed

modifiedcrates/jsonnet-evaluator/src/ctx.rsdiffbeforeafterboth
1use crate::{future_wrapper, rc_fn_helper, LazyBinding, ObjValue, LazyVal, Val};1use crate::{future_wrapper, rc_fn_helper, LazyBinding, LazyVal, ObjValue};
2use std::{cell::RefCell, collections::HashMap, fmt::Debug, rc::Rc};2use std::{cell::RefCell, collections::HashMap, fmt::Debug, rc::Rc};
33
4rc_fn_helper!(4rc_fn_helper!(
modifiedcrates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
1use 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 ASCII
288 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 }
modifiedcrates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth
238 assert_json_stdlib!(r#"std.base64("test")"#, r#""dGVzdA==""#);235 assert_json_stdlib!(r#"std.base64("test")"#, r#""dGVzdA==""#);
239 }236 }
237
238 #[test]
239 fn utf8_chars() {
240 assert_json_stdlib!(
241 r#"local c="😎";{c:std.codepoint(c),l:std.length(c)}"#,
242 r#"{"c":128526,"l":1}"#
243 )
244 }
240}245}
241246