difftreelog
feat add -c, -o, -m flags
in: master
3 files changed
Cargo.lockdiffbeforeafterboth148 "jrsonnet-evaluator",148 "jrsonnet-evaluator",149 "jrsonnet-parser",149 "jrsonnet-parser",150 "mimallocator",150 "mimallocator",151 "thiserror",151]152]152153153[[package]]154[[package]]176 "serde",177 "serde",177 "serde_json",178 "serde_json",178 "structdump",179 "structdump",180 "thiserror",179]181]180182181[[package]]183[[package]]428 "unicode-width",430 "unicode-width",429]431]432433[[package]]434name = "thiserror"435version = "1.0.20"436source = "registry+https://github.com/rust-lang/crates.io-index"437checksum = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08"438dependencies = [439 "thiserror-impl",440]441442[[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]430452431[[package]]453[[package]]432name = "unescape"454name = "unescape"cmds/jrsonnet/Cargo.tomldiffbeforeafterboth19jrsonnet-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 them21mimallocator = { version = "0.1.3", optional = true }21mimallocator = { version = "0.1.3", optional = true }22thiserror = "1.0.20"222323[dependencies.clap]24[dependencies.clap]24git = "https://github.com/clap-rs/clap"25git = "https://github.com/clap-rs/clap"cmds/jrsonnet/src/main.rsdiffbeforeafterboth1use 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};5106#[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}5152#[derive(thiserror::Error, Debug)]53enum Error {54 // Handled differently55 #[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}446545fn 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}517652fn 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)?;5580648965 let val = state.with_tla(val)?;90 let val = state.with_tla(val)?;669192 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 }6812069 Ok(())121 Ok(())70}122}