use clap::Parser;
use clap_verbosity_flag::log::Level;
use hugr::{extension::ExtensionRegistry, Extension, Hugr};
use crate::{CliError, HugrArgs};
#[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>, 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>, CliError> {
let reg = self.extensions()?;
let package = self.get_package_or_hugr(®)?;
package.validate()?;
Ok(package.into_hugrs())
}
pub fn extensions(&self) -> Result<ExtensionRegistry, CliError> {
let mut reg = 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);
}
Ok(reg)
}
pub fn verbosity(&self, level: Level) -> bool {
self.verbose.log_level_filter() >= level
}
}