hugr_cli/
validate.rs

1//! The `validate` subcommand.
2
3use anyhow::Result;
4use clap::Parser;
5use hugr::HugrView;
6use hugr::package::PackageValidationError;
7use tracing::info;
8
9use crate::CliError;
10use crate::hugr_io::HugrInputArgs;
11
12/// Validate and visualise a HUGR file.
13#[derive(Parser, Debug)]
14#[clap(version = "1.0", long_about = None)]
15#[clap(about = "Validate a HUGR.")]
16#[group(id = "hugr")]
17#[non_exhaustive]
18pub struct ValArgs {
19    /// Hugr input.
20    #[command(flatten)]
21    pub input_args: HugrInputArgs,
22}
23
24/// String to print when validation is successful.
25pub const VALID_PRINT: &str = "HUGR valid!";
26
27impl ValArgs {
28    /// Run the HUGR cli and validate against an extension registry.
29    pub fn run(&mut self) -> Result<()> {
30        if self.input_args.hugr_json {
31            let hugr = self.input_args.get_hugr()?;
32            let generator = hugr::envelope::get_generator(&[&hugr]);
33
34            hugr.validate()
35                .map_err(PackageValidationError::Validation)
36                .map_err(|val_err| wrap_generator(generator, val_err))?;
37        } else {
38            let package = self.input_args.get_package()?;
39            let generator = hugr::envelope::get_generator(&package.modules);
40            package
41                .validate()
42                .map_err(|val_err| wrap_generator(generator, val_err))?;
43        };
44
45        info!("{VALID_PRINT}");
46
47        Ok(())
48    }
49}
50
51fn wrap_generator(generator: Option<String>, val_err: PackageValidationError) -> CliError {
52    if let Some(g) = generator {
53        CliError::ValidateKnownGenerator {
54            inner: val_err,
55            generator: Box::new(g.to_string()),
56        }
57    } else {
58        CliError::Validate(val_err)
59    }
60}