use eure::data_model::VariantRepr;
use eure::query::{TextFile, TextFileContent};
use eure::query_flow::{DurabilityLevel, QueryRuntimeBuilder};
use eure_json::{Config as JsonConfig, EureToJson};
use crate::util::{VariantFormat, display_path, handle_query_error, read_input};
#[derive(clap::Args)]
pub struct Args {
pub file: String,
#[arg(short = 'v', long, value_enum, default_value = "external")]
pub variant: VariantFormat,
#[arg(short = 't', long, default_value = "type")]
pub tag: String,
#[arg(short = 'c', long, default_value = "content")]
pub content: String,
#[arg(short, long)]
pub pretty: bool,
}
pub fn run(args: Args) {
let file_opt = if args.file == "-" {
None
} else {
Some(args.file.as_str())
};
let contents = match read_input(file_opt) {
Ok(c) => c,
Err(e) => {
eprintln!("{e}");
std::process::exit(1);
}
};
let runtime = QueryRuntimeBuilder::new().build();
let file = TextFile::from_path(display_path(file_opt).into());
runtime.resolve_asset(
file.clone(),
TextFileContent::Content(contents),
DurabilityLevel::Static,
);
let variant_repr = match args.variant {
VariantFormat::External => VariantRepr::External,
VariantFormat::Internal => VariantRepr::Internal { tag: args.tag },
VariantFormat::Adjacent => VariantRepr::Adjacent {
tag: args.tag,
content: args.content,
},
VariantFormat::Untagged => VariantRepr::Untagged,
};
let config = JsonConfig { variant_repr };
let json_value = match runtime.query(EureToJson::new(file.clone(), config)) {
Ok(json) => json,
Err(e) => handle_query_error(&runtime, e),
};
let output = if args.pretty {
match serde_json::to_string_pretty(&json_value) {
Ok(s) => s,
Err(e) => {
eprintln!("Error serializing JSON: {e}");
std::process::exit(1);
}
}
} else {
match serde_json::to_string(&json_value) {
Ok(s) => s,
Err(e) => {
eprintln!("Error serializing JSON: {e}");
std::process::exit(1);
}
}
};
println!("{output}");
}