use bumpalo::Bump;
use std::path::PathBuf;
use structopt::StructOpt;
use jsonata::JsonAta;
#[derive(StructOpt)]
#[structopt(name = "jsonata")]
struct Opt {
#[structopt(short, long)]
ast: bool,
#[structopt(short, long, parse(from_os_str))]
expr_file: Option<PathBuf>,
#[structopt(short, long, parse(from_os_str))]
input_file: Option<PathBuf>,
expr: Option<String>,
input: Option<String>,
}
fn main() {
let opt = Opt::from_args();
let expr = match opt.expr_file {
Some(expr_file) => {
let expr = std::fs::read(expr_file).expect("Could not read expression input file");
String::from_utf8_lossy(&expr).to_string()
}
None => opt.expr.expect("No JSONata expression provided"),
};
let arena = Bump::new();
let jsonata = JsonAta::new(&expr, &arena);
match jsonata {
Ok(jsonata) => {
if opt.ast {
println!("{:#?}", jsonata.ast());
return;
}
let input = match opt.input_file {
Some(input_file) => {
std::fs::read_to_string(input_file).expect("Could not read the JSON input file")
}
None => opt.input.unwrap_or_else(|| "{}".to_string()),
};
match jsonata.evaluate(Some(&input)) {
Ok(result) => println!("{}", result.serialize(true)),
Err(error) => println!("{}", error),
}
}
Err(error) => println!("{}", error),
}
}