use clap::Parser;
use clap_verbosity_flag::Level;
use hugr::package::PackageValidationError;
use hugr::{extension::ExtensionRegistry, Extension, Hugr};
use crate::{CliError, HugrArgs};
#[doc(inline)]
#[deprecated(
since = "0.13.2",
note = "Use `hugr::package::PackageValidationError` instead."
)]
pub use hugr::package::PackageValidationError as ValError;
#[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,
}
pub const VALID_PRINT: &str = "HUGR valid!";
impl ValArgs {
pub fn run(&mut self) -> Result<(Vec<Hugr>, ExtensionRegistry), CliError> {
let result = self.hugr_args.validate()?;
if self.verbosity(Level::Info) {
eprintln!("{}", VALID_PRINT);
}
Ok(result)
}
pub fn verbosity(&self, level: Level) -> bool {
self.hugr_args.verbosity(level)
}
}
impl HugrArgs {
pub fn validate(&mut self) -> Result<(Vec<Hugr>, ExtensionRegistry), CliError> {
let mut package = self.get_package_or_hugr()?;
let mut reg: ExtensionRegistry = if self.no_std {
hugr::extension::PRELUDE_REGISTRY.to_owned()
} else {
hugr::std_extensions::STD_REG.to_owned()
};
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(PackageValidationError::Extension)?;
}
package.update_validate(&mut reg)?;
Ok((package.into_hugrs(), reg))
}
pub fn verbosity(&self, level: Level) -> bool {
self.verbose.log_level_filter() >= level
}
}