use clap_stdin::FileOrStdin;
use clap_verbosity_flag::{InfoLevel, Verbosity};
use thiserror::Error;
pub use {clap::Parser, clap_verbosity_flag::Level};
use hugr_core::{extension::ExtensionRegistry, Hugr, HugrView};
#[derive(Parser, Debug)]
#[clap(version = "1.0", long_about = None)]
#[clap(about = "Validate a HUGR.")]
#[group(id = "hugr")]
pub struct CmdLineArgs {
input: FileOrStdin,
#[arg(short, long, value_name = "MERMAID", help = "Visualise with mermaid.")]
mermaid: bool,
#[arg(short, long, help = "Skip validation.")]
no_validate: bool,
#[command(flatten)]
verbose: Verbosity<InfoLevel>,
}
#[derive(Error, Debug)]
pub enum CliError {
#[error("Error reading input: {0}")]
Input(#[from] clap_stdin::StdinError),
#[error("Error parsing input: {0}")]
Parse(#[from] serde_json::Error),
#[error("Error validating HUGR: {0}")]
Validate(#[from] hugr_core::hugr::ValidationError),
}
pub const VALID_PRINT: &str = "HUGR valid!";
impl CmdLineArgs {
pub fn run(&self, registry: &ExtensionRegistry) -> Result<Hugr, CliError> {
let mut hugr: Hugr = serde_json::from_reader(self.input.clone().into_reader()?)?;
if self.mermaid {
println!("{}", hugr.mermaid_string());
}
if !self.no_validate {
hugr.update_validate(registry)?;
if self.verbosity(Level::Info) {
eprintln!("{}", VALID_PRINT);
}
}
Ok(hugr)
}
pub fn verbosity(&self, level: Level) -> bool {
self.verbose.log_level_filter() >= level
}
}