git.delta.rocks / jrsonnet / refs/commits / 1b7abe84e611

difftreelog

perf faster format

Лач2020-07-20parent: #9d883c6.patch.diff
in: master

6 files changed

modifiedcrates/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(),
addedcrates/jrsonnet-evaluator/src/builtin/format.rsdiffbeforeafterboth

no changes

modifiedcrates/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;
modifiedcrates/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)]
modifiedcrates/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];
 			], {
modifiedcrates/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\"")