difftreelog
perf faster format
in: master
6 files changed
crates/jrsonnet-evaluator/build.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/build.rs
+++ b/crates/jrsonnet-evaluator/build.rs
@@ -39,7 +39,7 @@
if **name == *"join" || **name == *"manifestJsonEx" ||
**name == *"escapeStringJson" || **name == *"equals" ||
**name == *"base64" || **name == *"foldl" || **name == *"foldr" ||
- **name == *"sortImpl" || **name == *"range"
+ **name == *"sortImpl" || **name == *"format" || **name == *"range"
)
})
.collect(),
crates/jrsonnet-evaluator/src/builtin/format.rsdiffbeforeafterbothno changes
crates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/builtin/mod.rs
+++ b/crates/jrsonnet-evaluator/src/builtin/mod.rs
@@ -1,2 +1,4 @@
pub mod stdlib;
pub use stdlib::*;
+
+pub mod format;
crates/jrsonnet-evaluator/src/error.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/error.rs
+++ b/crates/jrsonnet-evaluator/src/error.rs
@@ -60,6 +60,7 @@
StringManifestOutputIsNotAString,
ImportCallbackError(String),
+ InvalidUnicodeCodepointGot(u32),
}
#[derive(Clone, Debug)]
crates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/evaluate.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate.rs
@@ -1,4 +1,5 @@
use crate::{
+ builtin::format::{format_arr, format_obj},
context_creator, create_error, create_error_result, equals, escape_string_json, future_wrapper,
lazy_val, manifest_json_ex, parse_args, primitive_equals, push, with_state, Context,
ContextCreator, Error, FuncDesc, LazyBinding, LazyVal, ObjMember, ObjValue, Result, Val,
@@ -634,6 +635,17 @@
Ok(Val::Arr(Rc::new(new_arr)))
}))?,
// faster
+ ("std", "format") => parse_args!(context, "std.format", args, 2, [
+ 0, str: [Val::Str]!!Val::Str, vec![ValType::Str];
+ 1, vals: [Val::Arr|Val::Obj], vec![ValType::Arr, ValType::Obj];
+ ], {
+ match vals {
+ Val::Arr(vals) => Val::Str(format_arr(&str, &vals).unwrap().into()),
+ Val::Obj(obj) => Val::Str(format_obj(&str, &obj).unwrap().into()),
+ _ => unreachable!()
+ }
+ }),
+ // faster
("std", "range") => parse_args!(context, "std.range", args, 2, [
0, from: [Val::Num]!!Val::Num, vec![ValType::Num];
0, to: [Val::Num]!!Val::Num, vec![ValType::Num];
@@ -648,9 +660,11 @@
0, n: [Val::Num]!!Val::Num, vec![ValType::Num];
], {
let mut out = String::new();
- out.push(std::char::from_u32(n as u32).unwrap());
- Val::Str(out.into())
- }),
+ out.push(std::char::from_u32(n as u32).ok_or_else(||
+ create_error(crate::error::Error::InvalidUnicodeCodepointGot(n as u32))
+ )?);
+ Ok(Val::Str(out.into()))
+ })?,
("std", "encodeUTF8") => parse_args!(context, "std.encodeUtf8", args, 1, [
0, str: [Val::Str]!!Val::Str, vec![ValType::Str];
], {
crates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/val.rs
+++ b/crates/jrsonnet-evaluator/src/val.rs
@@ -405,6 +405,15 @@
out
}
+pub fn to_string(val: &Val) -> Result<Rc<str>> {
+ Ok(match val {
+ Val::Bool(true) => "true".into(),
+ Val::Null => "null".into(),
+ Val::Str(s) => s.clone(),
+ v => v.clone().into_json(0)?,
+ })
+}
+
#[test]
fn json_test() {
assert_eq!(escape_string_json("\u{001f}"), "\"\\u001f\"")