git.delta.rocks / jrsonnet / refs/commits / 295345aa77d8

difftreelog

feat add -c, -o, -m flags

Lach2020-08-26parent: #946acf9.patch.diff
in: master

3 files changed

modifiedCargo.lockdiffbeforeafterboth
148 "jrsonnet-evaluator",148 "jrsonnet-evaluator",
149 "jrsonnet-parser",149 "jrsonnet-parser",
150 "mimallocator",150 "mimallocator",
151 "thiserror",
151]152]
152153
153[[package]]154[[package]]
176 "serde",177 "serde",
177 "serde_json",178 "serde_json",
178 "structdump",179 "structdump",
180 "thiserror",
179]181]
180182
181[[package]]183[[package]]
428 "unicode-width",430 "unicode-width",
429]431]
432
433[[package]]
434name = "thiserror"
435version = "1.0.20"
436source = "registry+https://github.com/rust-lang/crates.io-index"
437checksum = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08"
438dependencies = [
439 "thiserror-impl",
440]
441
442[[package]]
443name = "thiserror-impl"
444version = "1.0.20"
445source = "registry+https://github.com/rust-lang/crates.io-index"
446checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793"
447dependencies = [
448 "proc-macro2",
449 "quote",
450 "syn",
451]
430452
431[[package]]453[[package]]
432name = "unescape"454name = "unescape"
modifiedcmds/jrsonnet/Cargo.tomldiffbeforeafterboth
19jrsonnet-cli = { path = "../../crates/jrsonnet-cli", version = "0.1.0" }19jrsonnet-cli = { path = "../../crates/jrsonnet-cli", version = "0.1.0" }
20# TODO: Fix mimalloc compile errors, and use them20# TODO: Fix mimalloc compile errors, and use them
21mimallocator = { version = "0.1.3", optional = true }21mimallocator = { version = "0.1.3", optional = true }
22thiserror = "1.0.20"
2223
23[dependencies.clap]24[dependencies.clap]
24git = "https://github.com/clap-rs/clap"25git = "https://github.com/clap-rs/clap"
modifiedcmds/jrsonnet/src/main.rsdiffbeforeafterboth
1use clap::Clap;1use clap::Clap;
2use jrsonnet_cli::{ConfigureState, GeneralOpts, InputOpts, ManifestOpts};2use jrsonnet_cli::{ConfigureState, GeneralOpts, InputOpts, ManifestOpts, OutputOpts};
3use jrsonnet_evaluator::{error::Result, EvaluationState};3use jrsonnet_evaluator::{error::LocError, EvaluationState};
4use std::{path::PathBuf, rc::Rc};4use std::{
5 fs::{create_dir_all, File},
6 io::Write,
7 path::PathBuf,
8 rc::Rc,
9};
510
6#[cfg(feature = "mimalloc")]11#[cfg(feature = "mimalloc")]
24 general: GeneralOpts,29 general: GeneralOpts,
25 #[clap(flatten)]30 #[clap(flatten)]
26 manifest: ManifestOpts,31 manifest: ManifestOpts,
32 #[clap(flatten)]
33 output: OutputOpts,
27 #[clap(flatten)]34 #[clap(flatten)]
28 debug: DebugOpts,35 debug: DebugOpts,
29}36}
42 }49 }
43}50}
51
52#[derive(thiserror::Error, Debug)]
53enum Error {
54 // Handled differently
55 #[error("evaluation error")]
56 Evaluation(jrsonnet_evaluator::error::LocError),
57 #[error("io error")]
58 Io(#[from] std::io::Error),
59}
60impl From<LocError> for Error {
61 fn from(e: LocError) -> Self {
62 Self::Evaluation(e)
63 }
64}
4465
45fn main_catch(opts: Opts) {66fn main_catch(opts: Opts) {
46 let state = EvaluationState::default();67 let state = EvaluationState::default();
47 if let Err(e) = main_real(&state, opts) {68 if let Err(e) = main_real(&state, opts) {
69 if let Error::Evaluation(e) = e {
48 println!("{}", state.stringify_err(&e));70 println!("{}", state.stringify_err(&e));
49 }71 } else {
72 println!("{}", e);
73 }
74 }
50}75}
5176
52fn main_real(state: &EvaluationState, opts: Opts) -> Result<()> {77fn main_real(state: &EvaluationState, opts: Opts) -> Result<(), Error> {
53 opts.general.configure(&state)?;78 opts.general.configure(&state)?;
54 opts.manifest.configure(&state)?;79 opts.manifest.configure(&state)?;
5580
6489
65 let val = state.with_tla(val)?;90 let val = state.with_tla(val)?;
6691
92 if let Some(multi) = opts.output.multi {
93 if opts.output.create_output_dirs {
94 let mut dir = multi.clone();
95 dir.pop();
96 create_dir_all(dir)?;
97 }
98 for (file, data) in state.manifest_multi(val)?.iter() {
99 let mut path = multi.clone();
100 path.push(&file as &str);
101 if opts.output.create_output_dirs {
102 let mut dir = path.clone();
103 dir.pop();
104 create_dir_all(dir)?;
105 }
106 let mut file = File::create(path)?;
107 write!(file, "{}", data)?;
108 }
109 } else if let Some(path) = opts.output.output_file {
110 if opts.output.create_output_dirs {
111 let mut dir = path.clone();
112 dir.pop();
113 create_dir_all(dir)?;
114 }
115 let mut file = File::create(path)?;
116 write!(file, "{}", state.manifest(val)?)?;
117 } else {
67 println!("{}", state.manifest(val)?);118 println!("{}", state.manifest(val)?);
119 }
68120
69 Ok(())121 Ok(())
70}122}