difftreelog
perf use json serialization directly
in: master
4 files changed
cmds/jrsonnet/src/main.rsdiffbeforeafterboth--- a/cmds/jrsonnet/src/main.rs
+++ b/cmds/jrsonnet/src/main.rs
@@ -5,7 +5,7 @@
use jsonnet_parser::{el, Arg, ArgsDesc, Expr, LocExpr, ParserSettings};
use location::{offset_to_location, CodeLocation};
use std::env::current_dir;
-use std::{collections::HashMap, path::PathBuf, str::FromStr, rc::Rc};
+use std::{collections::HashMap, path::PathBuf, rc::Rc, str::FromStr};
enum Format {
None,
@@ -173,40 +173,20 @@
}
v => v,
};
- let v = match opts.format {
- Format::Json => {
- if opts.no_stdlib {
- evaluator.with_stdlib();
- }
- evaluator.add_global("__tmp__to_json__".into(), v);
- let v = evaluator.parse_evaluate_raw(&format!(
- "std.manifestJsonEx(__tmp__to_json__, \"{}\")",
- " ".repeat(opts.line_padding),
- ));
- match v {
- Ok(v) => v,
- Err(err) => {
- print_error(&err, evaluator, &opts);
- std::process::exit(1);
- }
- }
- }
+ let v = evaluator.run_in_state(|| match opts.format {
+ Format::Json => Ok(Val::Str(v.into_json(opts.line_padding)?)),
Format::Yaml => {
- if opts.no_stdlib {
- evaluator.with_stdlib();
- }
evaluator.add_global("__tmp__to_yaml__".into(), v);
- let v = evaluator
- .parse_evaluate_raw("std.manifestYamlDoc(__tmp__to_yaml__, \" \")");
- match v {
- Ok(v) => v,
- Err(err) => {
- print_error(&err, evaluator, &opts);
- std::process::exit(1);
- }
- }
+ evaluator.parse_evaluate_raw("std.manifestYamlDoc(__tmp__to_yaml__, \" \")")
+ }
+ _ => Ok(v),
+ });
+ let v = match v {
+ Ok(v) => v,
+ Err(err) => {
+ print_error(&err, evaluator, &opts);
+ std::process::exit(1);
}
- _ => v,
};
match v {
Val::Str(s) => println!("{}", s),
crates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth667 evaluate(context.clone(), &args[1].1)?,667 evaluate(context.clone(), &args[1].1)?,668 ) {668 ) {669 Val::Arr(Rc::new(669 Val::Arr(Rc::new(670 arr.iter()670 arr.iter()671 .cloned()671 .filter(|e| {672 .filter(|e| {672 predicate673 predicate673 .evaluate_values(context.clone(), &[e.clone()])674 .evaluate_values(context.clone(), &[e.clone()])674 .unwrap()675 .unwrap()675 .try_cast_bool("filter predicate")676 .try_cast_bool("filter predicate")676 .unwrap()677 .unwrap()677 })678 })678 .cloned()679 .collect(),679 .collect(),680 ))680 ))681 } else {681 } else {crates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth--- a/crates/jsonnet-evaluator/src/lib.rs
+++ b/crates/jsonnet-evaluator/src/lib.rs
@@ -296,7 +296,7 @@
Err(LocError(err, self.stack_trace()))
}
- fn run_in_state<T>(&self, f: impl FnOnce() -> T) -> T {
+ pub fn run_in_state<T>(&self, f: impl FnOnce() -> T) -> T {
EVAL_STATE.with(|v| {
let has_state = v.borrow().is_some();
if !has_state {
@@ -364,14 +364,11 @@
($str: expr) => {{
let evaluator = EvaluationState::default();
evaluator.with_stdlib();
- let val = evaluator.parse_evaluate_raw($str).unwrap();
- evaluator.add_global("__tmp__to_yaml__".into(), val);
evaluator
- .parse_evaluate_raw("std.manifestJsonEx(__tmp__to_yaml__, \"\")")
+ .parse_evaluate_raw($str)
.unwrap()
- .try_cast_str("there should be json string")
+ .into_json(0)
.unwrap()
- .clone()
.replace("\n", "")
}};
}
crates/jsonnet-evaluator/src/val.rsdiffbeforeafterboth--- a/crates/jsonnet-evaluator/src/val.rs
+++ b/crates/jsonnet-evaluator/src/val.rs
@@ -1,9 +1,9 @@
use crate::{
create_error, evaluate,
function::{inline_parse_function_call, place_args},
- with_state, Context, Error, ObjValue, Result,
+ Context, Error, ObjValue, Result,
};
-use jsonnet_parser::{el, Arg, ArgsDesc, Expr, LocExpr, ParamsDesc};
+use jsonnet_parser::{ArgsDesc, LocExpr, ParamsDesc};
use std::{
cell::RefCell,
fmt::{Debug, Display},
@@ -170,6 +170,11 @@
Val::Lazy(_) => self.clone().unwrap_if_lazy()?.value_type()?,
})
}
+ #[cfg(feature = "faster")]
+ pub fn into_json(self, padding: usize) -> Result<Rc<str>> {
+ manifest_json_ex(&self, &" ".repeat(padding)).map(|s| s.into())
+ }
+ #[cfg(not(feature = "faster"))]
pub fn into_json(self, padding: usize) -> Result<Rc<str>> {
with_state(|s| {
let ctx = s