1use std::{path::PathBuf, sync::Arc};
2
3use anyhow::anyhow;
4use clap::ValueHint;
5
6use conjure_cp_cli::utils::testing::{serialize_domains, serialize_model};
7
8use crate::cli::{GlobalArgs, LOGGING_HELP_HEADING};
9use crate::solve::{init_context, parse};
10
11#[derive(Clone, Debug, clap::Args)]
12pub struct Args {
13 #[arg(value_name = "INPUT_ESSENCE", value_hint = ValueHint::FilePath)]
15 pub input_file: PathBuf,
16
17 #[arg(long, help_heading=LOGGING_HELP_HEADING)]
19 pub output_format: String,
20}
21
22pub fn run_pretty_command(global_args: GlobalArgs, pretty_args: Args) -> anyhow::Result<()> {
23 let input_file = pretty_args.input_file.clone();
25 let context = init_context(&global_args, input_file, None)?;
26
27 let ctx_lock = context.read().unwrap();
29 let file = ctx_lock.essence_file_name.as_ref().unwrap();
30
31 let model = parse(&global_args, Arc::clone(&context), file)?;
32
33 let output = match pretty_args.output_format.as_str() {
35 "ast-json" => serialize_model(&model),
36 "expression-domains" => serialize_domains(&model),
37 _ => {
39 return Err(anyhow!(
40 "Unknown output format {}; supports [ast-json, expression-domains]",
41 &pretty_args.output_format
42 ));
43 }
44 };
45
46 let output = output.map_err(|err| anyhow!("Could not pretty print: {err}"))?;
47 print!("{output}");
48 Ok(())
49}