use clap::Parser;
use clap_verbosity_flag::Level;
use hugr_core::{extension::ExtensionRegistry, Extension, Hugr};
use thiserror::Error;
use crate::{CliError, HugrArgs, Package};
#[derive(Parser, Debug)]
#[clap(version = "1.0", long_about = None)]
#[clap(about = "Validate a HUGR.")]
#[group(id = "hugr")]
#[non_exhaustive]
pub struct ValArgs {
#[command(flatten)]
pub hugr_args: HugrArgs,
}
#[derive(Error, Debug)]
#[non_exhaustive]
pub enum ValError {
#[error("Error validating HUGR: {0}")]
Validate(#[from] hugr_core::hugr::ValidationError),
#[error("Error registering extension: {0}")]
ExtReg(#[from] hugr_core::extension::ExtensionRegistryError),
}
pub const VALID_PRINT: &str = "HUGR valid!";
impl ValArgs {
pub fn run(&mut self) -> Result<Vec<Hugr>, CliError> {
self.hugr_args.validate()
}
pub fn verbosity(&self, level: Level) -> bool {
self.hugr_args.verbosity(level)
}
}
impl HugrArgs {
pub fn validate(&mut self) -> Result<Vec<Hugr>, CliError> {
let Package {
mut modules,
extensions: packed_exts,
} = self.get_package()?;
let mut reg: ExtensionRegistry = if self.no_std {
hugr_core::extension::PRELUDE_REGISTRY.to_owned()
} else {
hugr_core::std_extensions::STD_REG.to_owned()
};
for ext in packed_exts {
reg.register_updated(ext).map_err(ValError::ExtReg)?;
}
for ext in &self.extensions {
let f = std::fs::File::open(ext)?;
let ext: Extension = serde_json::from_reader(f)?;
reg.register_updated(ext).map_err(ValError::ExtReg)?;
}
for hugr in modules.iter_mut() {
hugr.update_validate(®).map_err(ValError::Validate)?;
if self.verbosity(Level::Info) {
eprintln!("{}", VALID_PRINT);
}
}
Ok(modules)
}
pub fn verbosity(&self, level: Level) -> bool {
self.verbose.log_level_filter() >= level
}
}