difftreelog
feat std.extVar support
in: master
4 files changed
cmds/jrsonnet/src/main.rsdiffbeforeafterboth--- a/cmds/jrsonnet/src/main.rs
+++ b/cmds/jrsonnet/src/main.rs
@@ -42,19 +42,42 @@
}
}
+#[derive(Clone)]
+struct ExtStr {
+ name: String,
+ value: String,
+}
+impl FromStr for ExtStr {
+ type Err = &'static str;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let out: Vec<_> = s.split('=').collect();
+ match out.len() {
+ 1 => Ok(ExtStr {
+ name: out[0].to_owned(),
+ value: std::env::var(out[0]).or(Err("missing env var"))?,
+ }),
+ 2 => Ok(ExtStr {
+ name: out[0].to_owned(),
+ value: out[1].to_owned(),
+ }),
+ _ => Err("bad ext-str syntax"),
+ }
+ }
+}
+
#[derive(Clap)]
#[clap(version = "0.1.0", author = "Lach <iam@lach.pw>")]
struct Opts {
#[clap(long, about = "Disable global std variable")]
no_stdlib: bool,
#[clap(long, about = "Add external string")]
- ext_str: Option<Vec<String>>,
+ ext_str: Vec<ExtStr>,
#[clap(long, about = "Add external string from code")]
- ext_code: Option<Vec<String>>,
+ ext_code: Vec<ExtStr>,
#[clap(long, about = "Add TLA")]
- tla_str: Option<Vec<String>>,
+ tla_str: Vec<ExtStr>,
#[clap(long, about = "Add TLA from code")]
- tla_code: Option<Vec<String>>,
+ tla_code: Vec<ExtStr>,
#[clap(long, short = "f", default_value = "json", possible_values = &["none", "json", "yaml"], about = "Output format, wraps resulting value to corresponding std.manifest call")]
format: Format,
#[clap(long, default_value = "default", possible_values = &["cpp", "go", "default"], about = "Emulated needed stacktrace display")]
@@ -92,6 +115,12 @@
if !opts.no_stdlib {
evaluator.with_stdlib();
}
+ for ExtStr { name, value } in opts.ext_str.iter().cloned() {
+ evaluator.add_ext_var(name, Val::Str(value));
+ }
+ for ExtStr { name, value } in opts.ext_code.iter().cloned() {
+ evaluator.add_ext_var(name, evaluator.parse_evaluate_raw(&value).unwrap());
+ }
let mut input = current_dir().unwrap();
input.push(opts.input.clone());
let code_string = String::from_utf8(std::fs::read(opts.input.clone()).unwrap()).unwrap();
crates/jsonnet-evaluator/src/error.rsdiffbeforeafterboth--- a/crates/jsonnet-evaluator/src/error.rs
+++ b/crates/jsonnet-evaluator/src/error.rs
@@ -12,6 +12,8 @@
TooManyArgsFunctionHas(usize),
FunctionParameterNotBoundInCall(String),
+ UndefinedExternalVariable(String),
+
RuntimeError(String),
StackOverflow,
FractionalIndex,
crates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth--- a/crates/jsonnet-evaluator/src/evaluate.rs
+++ b/crates/jsonnet-evaluator/src/evaluate.rs
@@ -533,6 +533,20 @@
panic!("bad pow call");
}
}
+ ("std", "extVar") => {
+ assert_eq!(args.len(), 1);
+ if let Val::Str(a) = evaluate(context, &args[0].1)? {
+ with_state(|s| s.0.ext_vars.borrow().get(&a).cloned()).ok_or_else(
+ || {
+ create_error::<()>(crate::Error::UndefinedExternalVariable(a))
+ .err()
+ .unwrap()
+ },
+ )?
+ } else {
+ panic!("bad extVar call");
+ }
+ }
(ns, name) => panic!("Intristic not found: {}.{}", ns, name),
},
Val::Func(f) => {
crates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth72 files: RefCell<HashMap<PathBuf, FileData>>,72 files: RefCell<HashMap<PathBuf, FileData>>,73 globals: RefCell<HashMap<String, Val>>,73 globals: RefCell<HashMap<String, Val>>,7475 /// Values to use with std.extVar76 ext_vars: RefCell<HashMap<String, Val>>,747775 settings: EvaluationSettings,78 settings: EvaluationSettings,76}79}177 pub fn add_global(&self, name: String, value: Val) {180 pub fn add_global(&self, name: String, value: Val) {178 self.0.globals.borrow_mut().insert(name, value);181 self.0.globals.borrow_mut().insert(name, value);179 }182 }183 pub fn add_ext_var(&self, name: String, value: Val) {184 self.0.ext_vars.borrow_mut().insert(name, value);185 }180186181 pub fn with_stdlib(&self) -> &Self {187 pub fn with_stdlib(&self) -> &Self {182 self.begin_state();188 self.begin_state();