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.rsdiffbeforeafterboth--- a/crates/jsonnet-evaluator/src/evaluate.rs
+++ b/crates/jsonnet-evaluator/src/evaluate.rs
@@ -668,6 +668,7 @@
) {
Val::Arr(Rc::new(
arr.iter()
+ .cloned()
.filter(|e| {
predicate
.evaluate_values(context.clone(), &[e.clone()])
@@ -675,7 +676,6 @@
.try_cast_bool("filter predicate")
.unwrap()
})
- .cloned()
.collect(),
))
} else {
crates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth296 Err(LocError(err, self.stack_trace()))296 Err(LocError(err, self.stack_trace()))297 }297 }298298299 fn run_in_state<T>(&self, f: impl FnOnce() -> T) -> T {299 pub fn run_in_state<T>(&self, f: impl FnOnce() -> T) -> T {300 EVAL_STATE.with(|v| {300 EVAL_STATE.with(|v| {301 let has_state = v.borrow().is_some();301 let has_state = v.borrow().is_some();302 if !has_state {302 if !has_state {364 ($str: expr) => {{364 ($str: expr) => {{365 let evaluator = EvaluationState::default();365 let evaluator = EvaluationState::default();366 evaluator.with_stdlib();366 evaluator.with_stdlib();367 let val = evaluator.parse_evaluate_raw($str).unwrap();367 evaluator368 .parse_evaluate_raw($str)369 .unwrap()368 evaluator.add_global("__tmp__to_yaml__".into(), val);370 .into_json(0)369 evaluator370 .parse_evaluate_raw("std.manifestJsonEx(__tmp__to_yaml__, \"\")")371 .unwrap()371 .unwrap()372 .try_cast_str("there should be json string")373 .unwrap()374 .clone()375 .replace("\n", "")372 .replace("\n", "")376 }};373 }};377 }374 }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