use core::error::Error;
use itertools::intersperse;
use pipa::value::Value;
use pipa::value::map::Map;
use std::env;
use std::io;
pub fn main() -> Result<(), Box<dyn Error>> {
let map = map_from_stdin()?;
let exp = exp_from_args();
let value = eval_expression(map, exp.as_bytes())?;
let value = format_value(value)?;
println!("{value}");
Ok(())
}
fn map_from_stdin() -> Result<Map, Box<dyn Error>> {
let mut input = String::new();
io::Read::read_to_string(&mut io::stdin(), &mut input)?;
Ok(pipa::value::parse::json_map(input.trim().as_bytes())?)
}
fn exp_from_args() -> String {
let args = env::args().skip(1);
let args = intersperse(args, String::from(" | "));
args.collect()
}
fn eval_expression(mut map: Map, exp: &[u8]) -> Result<Value, Box<dyn Error>> {
let adapter = pipa::lang::adapter::Default::default();
let eval = pipa::lang::eval_expression(&adapter, &mut map, exp)?;
Ok(eval.result)
}
fn format_value(value: Value) -> Result<String, Box<dyn Error>> {
let value = value.with_meta("internal-serialize", "simple");
let value = pipa::value::format::json_string_pretty(value)?;
Ok(value)
}