--- a/cmds/jrsonnet/src/main.rs +++ b/cmds/jrsonnet/src/main.rs @@ -53,7 +53,7 @@ opts.general.configure(&state)?; opts.manifest.configure(&state)?; - let val = if opts.input.evaluate { + let val = if opts.input.exec { state.evaluate_snippet_raw( Rc::new(PathBuf::from("args")), (&opts.input.input as &str).into(), --- a/crates/jrsonnet-cli/src/ext.rs +++ b/crates/jrsonnet-cli/src/ext.rs @@ -1,7 +1,7 @@ use crate::ConfigureState; use clap::Clap; use jrsonnet_evaluator::{error::Result, EvaluationState}; -use std::str::FromStr; +use std::{fs::read_to_string, str::FromStr}; #[derive(Clone)] pub struct ExtStr { @@ -28,6 +28,31 @@ } } +#[derive(Clone)] +pub struct ExtFile { + pub name: String, + pub value: String, +} + +impl FromStr for ExtFile { + type Err = String; + + fn from_str(s: &str) -> std::result::Result { + let out: Vec<&str> = s.split('=').collect(); + if out.len() != 2 { + return Err("bad ext-file syntax".to_owned()); + } + let file = read_to_string(&out[1]); + match file { + Ok(content) => Ok(Self { + name: out[0].into(), + value: content, + }), + Err(e) => Err(format!("{}", e)), + } + } +} + #[derive(Clap)] // #[clap(help_heading = "EXTERNAL VARIABLES")] pub struct ExtVarOpts { @@ -38,23 +63,33 @@ /// Can be accessed from code via `std.extVar("name")`. #[clap(long, short = 'V', name = "name[=var data]", number_of_values = 1)] ext_str: Vec, - // / Read string external variable from file. - // / See also `--ext-str` - // #[clap(long, name = "name[=var path]", number_of_values = 1)] - // ext_str_file: Vec, + /// Read string external variable from file. + /// See also `--ext-str` + #[clap(long, name = "name=var path", number_of_values = 1)] + ext_str_file: Vec, /// Add external variable from code. /// See also `--ext-str` #[clap(long, name = "name[=var source]", number_of_values = 1)] ext_code: Vec, + /// Read string external variable from file. + /// See also `--ext-str` + #[clap(long, name = "name=var code path", number_of_values = 1)] + ext_code_file: Vec, } impl ConfigureState for ExtVarOpts { fn configure(&self, state: &EvaluationState) -> Result<()> { for ext in self.ext_str.iter() { state.add_ext_str((&ext.name as &str).into(), (&ext.value as &str).into()); } + for ext in self.ext_str_file.iter() { + state.add_ext_str((&ext.name as &str).into(), (&ext.value as &str).into()); + } for ext in self.ext_code.iter() { state.add_ext_code((&ext.name as &str).into(), (&ext.value as &str).into())?; } + for ext in self.ext_code_file.iter() { + state.add_ext_code((&ext.name as &str).into(), (&ext.value as &str).into())?; + } Ok(()) } } --- a/crates/jrsonnet-cli/src/lib.rs +++ b/crates/jrsonnet-cli/src/lib.rs @@ -24,7 +24,7 @@ short = 'e', about = "Treat input as code, evaluate them instead of reading file" )] - pub evaluate: bool, + pub exec: bool, #[clap( about = "Path to the file to be compiled if `--evaluate` is unset, otherwise code itself" --- a/crates/jrsonnet-cli/src/tla.rs +++ b/crates/jrsonnet-cli/src/tla.rs @@ -1,4 +1,4 @@ -use crate::{ConfigureState, ExtStr}; +use crate::{ConfigureState, ExtFile, ExtStr}; use clap::Clap; use jrsonnet_evaluator::{error::Result, EvaluationState}; @@ -13,21 +13,31 @@ tla_str: Vec, /// Read top level argument string from file. /// See also `--tla-str` - // #[clap(long, name = "name[=tla path]", number_of_values = 1)] - // tla_str_file: Vec, + #[clap(long, name = "name=tla path", number_of_values = 1)] + tla_str_file: Vec, /// Add top level argument from code. /// See also `--tla-str` #[clap(long, name = "name[=tla source]", number_of_values = 1)] tla_code: Vec, + /// Read top level argument code from file. + /// See also `--tla-str` + #[clap(long, name = "name=tla code path", number_of_values = 1)] + tla_code_file: Vec, } impl ConfigureState for TLAOpts { fn configure(&self, state: &EvaluationState) -> Result<()> { for tla in self.tla_str.iter() { state.add_tla_str((&tla.name as &str).into(), (&tla.value as &str).into()); } + for tla in self.tla_str_file.iter() { + state.add_tla_str((&tla.name as &str).into(), (&tla.value as &str).into()) + } for tla in self.tla_code.iter() { state.add_tla_code((&tla.name as &str).into(), (&tla.value as &str).into())?; } + for tla in self.tla_code_file.iter() { + state.add_tla_code((&tla.name as &str).into(), (&tla.value as &str).into())?; + } Ok(()) } }