difftreelog
style run rustfmt
in: master
4 files changed
cmds/jrsonnet/src/main.rsdiffbeforeafterboth1use clap::Clap;2use jrsonnet_evaluator::Val;3use jrsonnet_parser::{el, Arg, ArgsDesc, Expr, LocExpr, ParserSettings};4use jrsonnet_trace::{CompactFormat, ExplainingFormat, PathResolver, TraceFormat};5use std::env::current_dir;6use std::{collections::HashMap, path::PathBuf, rc::Rc, str::FromStr};78#[global_allocator]9static GLOBAL: mimallocator::Mimalloc = mimallocator::Mimalloc;1011enum Format {12 None,13 Json,14 Yaml,15}1617impl FromStr for Format {18 type Err = &'static str;19 fn from_str(s: &str) -> Result<Self, Self::Err> {20 Ok(match s {21 "none" => Format::None,22 "json" => Format::Json,23 "yaml" => Format::Yaml,24 _ => return Err("no such format"),25 })26 }27}2829#[derive(PartialEq)]30enum TraceFormatName {31 Compact,32 Explaining,33}34impl FromStr for TraceFormatName {35 type Err = &'static str;36 fn from_str(s: &str) -> Result<Self, Self::Err> {37 Ok(match s {38 "compact" => TraceFormatName::Compact,39 "explaining" => TraceFormatName::Explaining,40 _ => return Err("no such format"),41 })42 }43}4445#[derive(Clone)]46struct ExtStr {47 name: String,48 value: String,49}50impl FromStr for ExtStr {51 type Err = &'static str;52 fn from_str(s: &str) -> Result<Self, Self::Err> {53 let out: Vec<_> = s.split('=').collect();54 match out.len() {55 1 => Ok(ExtStr {56 name: out[0].to_owned(),57 value: std::env::var(out[0]).or(Err("missing env var"))?,58 }),59 2 => Ok(ExtStr {60 name: out[0].to_owned(),61 value: out[1].to_owned(),62 }),63 _ => Err("bad ext-str syntax"),64 }65 }66}6768#[derive(Clap)]69#[clap(name = "jrsonnet", version, author)]70pub struct Opts {71 #[clap(long, about = "Disable global std variable")]72 no_stdlib: bool,73 #[clap(long, about = "Add external string", number_of_values = 1)]74 ext_str: Vec<ExtStr>,75 #[clap(long, about = "Add external string from code", number_of_values = 1)]76 ext_code: Vec<ExtStr>,77 #[clap(long, about = "Add TLA", number_of_values = 1)]78 tla_str: Vec<ExtStr>,79 #[clap(long, about = "Add TLA from code", number_of_values = 1)]80 tla_code: Vec<ExtStr>,81 #[clap(long, short = "f", default_value = "json", possible_values = &["none", "json", "yaml"], about = "Output format, wraps resulting value to corresponding std.manifest call")]82 format: Format,83 #[clap(long, default_value = "compact", possible_values = &["compact", "explaining"], about = "Choose format of displayed stacktraces")]84 trace_format: TraceFormatName,8586 #[clap(87 long,88 short = "s",89 default_value = "200",90 about = "Number of allowed stack frames"91 )]92 max_stack: usize,93 #[clap(94 long,95 short = "t",96 default_value = "20",97 about = "Max length of stack trace before cropping"98 )]99 max_trace: usize,100101 #[clap(102 long,103 about = "Required os stack size, probally you shouldn't change it"104 )]105 thread_stack_size: Option<usize>,106107 #[clap(long, short = "J", about = "Library search dir")]108 jpath: Vec<PathBuf>,109110 #[clap(111 long,112 default_value = "3",113 about = "When using --format, this option specifies string to pad output with"114 )]115 line_padding: usize,116117 #[clap(about = "File to compile")]118 input: String,119}120121fn main() {122 let opts: Opts = Opts::parse();123 if let Some(size) = opts.thread_stack_size {124 std::thread::Builder::new()125 .stack_size(size * 1024 * 1024)126 .spawn(|| main_real(opts))127 .unwrap()128 .join()129 .unwrap();130 } else {131 main_real(opts)132 }133}134135fn main_real(opts: Opts) {136 let evaluator = jrsonnet_evaluator::EvaluationState::default();137 evaluator.set_max_trace(opts.max_trace);138 evaluator.set_max_stack(opts.max_stack);139 evaluator.set_import_resolver(Box::new(jrsonnet_evaluator::FileImportResolver {140 library_paths: opts.jpath.clone(),141 }));142 if !opts.no_stdlib {143 evaluator.with_stdlib();144 }145 for ExtStr { name, value } in opts.ext_str.iter().cloned() {146 evaluator.add_ext_var(name.into(), Val::Str(value.into()));147 }148 for ExtStr { name, value } in opts.ext_code.iter().cloned() {149 evaluator.add_ext_var(name.into(), evaluator.parse_evaluate_raw(&value).unwrap());150 }151152 let resolver = PathResolver::Relative(std::env::current_dir().unwrap());153 let trace_format: Box<dyn TraceFormat> = match opts.trace_format {154 TraceFormatName::Compact => Box::new(CompactFormat { resolver }),155 TraceFormatName::Explaining => Box::new(ExplainingFormat { resolver }),156 };157158 let mut input = current_dir().unwrap();159 input.push(opts.input.clone());160 let code_string = String::from_utf8(std::fs::read(opts.input.clone()).unwrap()).unwrap();161 if let Err(e) = evaluator.add_file(Rc::new(input.clone()), code_string.into()) {162 trace_format.print_trace(&evaluator, &e).unwrap();163 std::process::exit(1);164 }165 let result = evaluator.evaluate_file(&input);166 match result {167 Ok(v) => {168 let v = match v {169 Val::Func(f) => {170 let mut desc_map = HashMap::new();171 for ExtStr { name, value } in opts.tla_str.iter().cloned() {172 desc_map.insert(name, el!(Expr::Str(value.into())));173 }174 for ExtStr { name, value } in opts.tla_code.iter().cloned() {175 desc_map.insert(176 name,177 jrsonnet_parser::parse(178 &value,179 &ParserSettings {180 file_name: Rc::new(PathBuf::new()),181 loc_data: false,182 },183 )184 .unwrap(),185 );186 }187 evaluator.add_global("__tmp__tlf__".into(), Val::Func(f));188 evaluator189 .evaluate_raw(el!(Expr::Apply(190 el!(Expr::Var("__tmp__tlf__".into())),191 ArgsDesc(desc_map.into_iter().map(|(k, v)| Arg(Some(k), v)).collect()),192 false,193 )))194 .unwrap()195 }196 v => v,197 };198 let v = evaluator.run_in_state(|| match opts.format {199 Format::Json => Ok(Val::Str(v.into_json(opts.line_padding)?)),200 Format::Yaml => Ok(Val::Str(v.into_yaml(opts.line_padding)?)),201 _ => Ok(v),202 });203 let v = match v {204 Ok(v) => v,205 Err(err) => {206 trace_format.print_trace(&evaluator, &err).unwrap();207 std::process::exit(1);208 }209 };210 match v {211 Val::Str(s) => println!("{}", s),212 Val::Num(n) => println!("{}", n),213 _v => eprintln!(214 "jsonnet output is not a string.\nDid you forgot to set --format, or wrap your data with std.manifestJson?"215 ),216 }217 }218 Err(err) => {219 trace_format.print_trace(&evaluator, &err).unwrap();220 std::process::exit(1);221 }222 }223}1use clap::Clap;2use jrsonnet_evaluator::Val;3use jrsonnet_parser::{el, Arg, ArgsDesc, Expr, LocExpr, ParserSettings};4use jrsonnet_trace::{CompactFormat, ExplainingFormat, PathResolver, TraceFormat};5use std::env::current_dir;6use std::{collections::HashMap, path::PathBuf, rc::Rc, str::FromStr};78#[global_allocator]9static GLOBAL: mimallocator::Mimalloc = mimallocator::Mimalloc;1011enum Format {12 None,13 Json,14 Yaml,15}1617impl FromStr for Format {18 type Err = &'static str;19 fn from_str(s: &str) -> Result<Self, Self::Err> {20 Ok(match s {21 "none" => Format::None,22 "json" => Format::Json,23 "yaml" => Format::Yaml,24 _ => return Err("no such format"),25 })26 }27}2829#[derive(PartialEq)]30enum TraceFormatName {31 Compact,32 Explaining,33}34impl FromStr for TraceFormatName {35 type Err = &'static str;36 fn from_str(s: &str) -> Result<Self, Self::Err> {37 Ok(match s {38 "compact" => TraceFormatName::Compact,39 "explaining" => TraceFormatName::Explaining,40 _ => return Err("no such format"),41 })42 }43}4445#[derive(Clone)]46struct ExtStr {47 name: String,48 value: String,49}50impl FromStr for ExtStr {51 type Err = &'static str;52 fn from_str(s: &str) -> Result<Self, Self::Err> {53 let out: Vec<_> = s.split('=').collect();54 match out.len() {55 1 => Ok(ExtStr {56 name: out[0].to_owned(),57 value: std::env::var(out[0]).or(Err("missing env var"))?,58 }),59 2 => Ok(ExtStr {60 name: out[0].to_owned(),61 value: out[1].to_owned(),62 }),63 _ => Err("bad ext-str syntax"),64 }65 }66}6768#[derive(Clap)]69#[clap(name = "jrsonnet", version, author)]70pub struct Opts {71 #[clap(long, about = "Disable global std variable")]72 no_stdlib: bool,73 #[clap(long, about = "Add external string", number_of_values = 1)]74 ext_str: Vec<ExtStr>,75 #[clap(long, about = "Add external string from code", number_of_values = 1)]76 ext_code: Vec<ExtStr>,77 #[clap(long, about = "Add TLA", number_of_values = 1)]78 tla_str: Vec<ExtStr>,79 #[clap(long, about = "Add TLA from code", number_of_values = 1)]80 tla_code: Vec<ExtStr>,81 #[clap(long, short = "f", default_value = "json", possible_values = &["none", "json", "yaml"], about = "Output format, wraps resulting value to corresponding std.manifest call")]82 format: Format,83 #[clap(long, default_value = "compact", possible_values = &["compact", "explaining"], about = "Choose format of displayed stacktraces")]84 trace_format: TraceFormatName,8586 #[clap(87 long,88 short = "s",89 default_value = "200",90 about = "Number of allowed stack frames"91 )]92 max_stack: usize,93 #[clap(94 long,95 short = "t",96 default_value = "20",97 about = "Max length of stack trace before cropping"98 )]99 max_trace: usize,100101 #[clap(102 long,103 about = "Required os stack size, probally you shouldn't change it"104 )]105 thread_stack_size: Option<usize>,106107 #[clap(long, short = "J", about = "Library search dir")]108 jpath: Vec<PathBuf>,109110 #[clap(111 long,112 default_value = "3",113 about = "When using --format, this option specifies string to pad output with"114 )]115 line_padding: usize,116117 #[clap(about = "File to compile")]118 input: String,119}120121fn main() {122 let opts: Opts = Opts::parse();123 if let Some(size) = opts.thread_stack_size {124 std::thread::Builder::new()125 .stack_size(size * 1024 * 1024)126 .spawn(|| main_real(opts))127 .unwrap()128 .join()129 .unwrap();130 } else {131 main_real(opts)132 }133}134135fn main_real(opts: Opts) {136 let evaluator = jrsonnet_evaluator::EvaluationState::default();137 {138 let mut settings = evaluator.settings_mut();139 settings.max_stack = opts.max_stack;140 settings.max_trace = opts.max_trace;141 settings.import_resolver = Box::new(jrsonnet_evaluator::FileImportResolver {142 library_paths: opts.jpath.clone(),143 });144 }145 if !opts.no_stdlib {146 evaluator.with_stdlib();147 }148 for ExtStr { name, value } in opts.ext_str.iter().cloned() {149 evaluator150 .settings_mut()151 .ext_vars152 .insert(name.into(), Val::Str(value.into()));153 }154 for ExtStr { name, value } in opts.ext_code.iter().cloned() {155 evaluator.settings_mut().ext_vars.insert(156 name.clone().into(),157 evaluator158 .parse_evaluate_raw(PathBuf::from(format!("ext_code {}", name)).into(), &value)159 .unwrap(),160 );161 }162163 let resolver = PathResolver::Relative(std::env::current_dir().unwrap());164 let trace_format: Box<dyn TraceFormat> = match opts.trace_format {165 TraceFormatName::Compact => Box::new(CompactFormat { resolver }),166 TraceFormatName::Explaining => Box::new(ExplainingFormat { resolver }),167 };168169 let mut input = current_dir().unwrap();170 input.push(opts.input.clone());171 let code_string = String::from_utf8(std::fs::read(opts.input.clone()).unwrap()).unwrap();172 if let Err(e) = evaluator.add_file(Rc::new(input.clone()), code_string.into()) {173 trace_format.print_trace(&evaluator, &e).unwrap();174 std::process::exit(1);175 }176 let result = evaluator.evaluate_file(&input);177 match result {178 Ok(v) => {179 let v = match v {180 Val::Func(f) => {181 let mut desc_map = HashMap::new();182 for ExtStr { name, value } in opts.tla_str.iter().cloned() {183 desc_map.insert(name, el!(Expr::Str(value.into())));184 }185 for ExtStr { name, value } in opts.tla_code.iter().cloned() {186 desc_map.insert(187 name,188 jrsonnet_parser::parse(189 &value,190 &ParserSettings {191 file_name: Rc::new(PathBuf::new()),192 loc_data: false,193 },194 )195 .unwrap(),196 );197 }198 evaluator199 .settings_mut()200 .globals201 .insert("__tmp__tlf__".into(), Val::Func(f));202 evaluator203 .evaluate_raw(el!(Expr::Apply(204 el!(Expr::Var("__tmp__tlf__".into())),205 ArgsDesc(desc_map.into_iter().map(|(k, v)| Arg(Some(k), v)).collect()),206 false,207 )))208 .unwrap()209 }210 v => v,211 };212 let v = evaluator.run_in_state(|| match opts.format {213 Format::Json => Ok(Val::Str(v.into_json(opts.line_padding)?)),214 Format::Yaml => Ok(Val::Str(v.into_yaml(opts.line_padding)?)),215 _ => Ok(v),216 });217 let v = match v {218 Ok(v) => v,219 Err(err) => {220 trace_format.print_trace(&evaluator, &err).unwrap();221 std::process::exit(1);222 }223 };224 match v {225 Val::Str(s) => println!("{}", s),226 Val::Num(n) => println!("{}", n),227 _v => eprintln!(228 "jsonnet output is not a string.\nDid you forgot to set --format, or wrap your data with std.manifestJson?"229 ),230 }231 }232 Err(err) => {233 trace_format.print_trace(&evaluator, &err).unwrap();234 std::process::exit(1);235 }236 }237}crates/jrsonnet-evaluator/src/function.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/function.rs
+++ b/crates/jrsonnet-evaluator/src/function.rs
@@ -136,8 +136,8 @@
#[test]
fn test() -> Result<()> {
+ use crate::val::ValType;
use jrsonnet_parser::*;
- use crate::val::ValType;
let state = crate::EvaluationState::default();
let evaluator = state.with_stdlib();
let ctx = evaluator.create_default_context()?;
crates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/lib.rs
+++ b/crates/jrsonnet-evaluator/src/lib.rs
@@ -7,6 +7,7 @@
extern crate test;
+mod builtin;
mod ctx;
mod dynamic;
mod error;
@@ -15,8 +16,8 @@
mod import;
mod map;
mod obj;
-mod val;
pub mod trace;
+mod val;
pub use ctx::*;
pub use dynamic::*;
@@ -26,9 +27,15 @@
pub use import::*;
use jrsonnet_parser::*;
pub use obj::*;
-use std::{cell::{Ref, RefCell, RefMut}, collections::HashMap, fmt::Debug, path::PathBuf, rc::Rc};
+use std::{
+ cell::{Ref, RefCell, RefMut},
+ collections::HashMap,
+ fmt::Debug,
+ path::PathBuf,
+ rc::Rc,
+};
+use trace::{offset_to_location, CodeLocation};
pub use val::*;
-use trace::{offset_to_location, CodeLocation};
type BindableFn = dyn Fn(Option<ObjValue>, Option<ObjValue>) -> Result<LazyVal>;
#[derive(Clone)]
@@ -319,7 +326,7 @@
drop(data);
return Err(self.error(Error::StackOverflow));
} else {
- *stack_depth+=1;
+ *stack_depth += 1;
}
}
let result = f();
@@ -355,30 +362,28 @@
#[cfg(test)]
pub mod tests {
use super::Val;
- use crate::{create_error, EvaluationState, primitive_equals};
+ use crate::{create_error, primitive_equals, EvaluationState};
use jrsonnet_parser::*;
use std::{path::PathBuf, rc::Rc};
#[test]
fn eval_state_stacktrace() {
let state = EvaluationState::default();
- state.run_in_state(||{
+ state.run_in_state(|| {
state
- .push(
- &ExprLocation(Rc::new(PathBuf::from("test1.jsonnet")), 10, 20),
- || "outer".to_owned(),
- || {
- state.push(
- &ExprLocation(Rc::new(PathBuf::from("test2.jsonnet")), 30, 40),
- || "inner".to_owned(),
- || {
- Err(create_error(crate::error::Error::RuntimeError("".into())))
- },
- )?;
- Ok(())
- },
- )
- .unwrap();
+ .push(
+ &ExprLocation(Rc::new(PathBuf::from("test1.jsonnet")), 10, 20),
+ || "outer".to_owned(),
+ || {
+ state.push(
+ &ExprLocation(Rc::new(PathBuf::from("test2.jsonnet")), 30, 40),
+ || "inner".to_owned(),
+ || Err(create_error(crate::error::Error::RuntimeError("".into()))),
+ )?;
+ Ok(())
+ },
+ )
+ .unwrap();
});
}
@@ -386,19 +391,23 @@
fn eval_state_standard() {
let state = EvaluationState::default();
state.with_stdlib();
- assert!(
- primitive_equals(
- &state.parse_evaluate_raw(r#"std.assertEqual(std.base64("test"), "dGVzdA==")"#).unwrap(),
- &Val::Bool(true),
- ).unwrap()
- );
+ assert!(primitive_equals(
+ &state
+ .parse_evaluate_raw(
+ Rc::new(PathBuf::from("raw.jsonnet")),
+ r#"std.assertEqual(std.base64("test"), "dGVzdA==")"#
+ )
+ .unwrap(),
+ &Val::Bool(true),
+ )
+ .unwrap());
}
macro_rules! eval {
($str: expr) => {
EvaluationState::default()
.with_stdlib()
- .parse_evaluate_raw($str)
+ .parse_evaluate_raw(Rc::new(PathBuf::from("raw.jsonnet")), $str)
.unwrap()
};
}
@@ -406,15 +415,15 @@
($str: expr) => {{
let evaluator = EvaluationState::default();
evaluator.with_stdlib();
- evaluator.run_in_state(||{
+ evaluator.run_in_state(|| {
evaluator
- .parse_evaluate_raw($str)
+ .parse_evaluate_raw(Rc::new(PathBuf::from("raw.jsonnet")), $str)
.unwrap()
.into_json(0)
.unwrap()
.replace("\n", "")
- })
- }}
+ })
+ }};
}
/// Asserts given code returns `true`
@@ -638,12 +647,11 @@
#[test]
fn string_is_string() {
- assert!(
- primitive_equals(
- &eval!("local arr = 'hello'; (!std.isArray(arr)) && (!std.isString(arr))"),
- &Val::Bool(false),
- ).unwrap()
- );
+ assert!(primitive_equals(
+ &eval!("local arr = 'hello'; (!std.isArray(arr)) && (!std.isString(arr))"),
+ &Val::Bool(false),
+ )
+ .unwrap());
}
#[test]
@@ -746,8 +754,14 @@
}
#[test]
- fn equality(){
- println!("{:?}", jrsonnet_parser::parse("{ x: 1, y: 2 } == { x: 1, y: 2 }", &ParserSettings::default()));
+ fn equality() {
+ println!(
+ "{:?}",
+ jrsonnet_parser::parse(
+ "{ x: 1, y: 2 } == { x: 1, y: 2 }",
+ &ParserSettings::default()
+ )
+ );
assert_eval!("{ x: 1, y: 2 } == { x: 1, y: 2 }")
}
}
crates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/val.rs
+++ b/crates/jrsonnet-evaluator/src/val.rs
@@ -358,7 +358,9 @@
buf.push_str(cur_padding);
buf.push('}');
}
- Val::Func(_) | Val::Intristic(_, _) => create_error_result(Error::RuntimeError("tried to manifest function".into()))?,
+ Val::Func(_) | Val::Intristic(_, _) => {
+ create_error_result(Error::RuntimeError("tried to manifest function".into()))?
+ }
Val::Lazy(_) => unreachable!(),
};
Ok(())