hugr_cli/
validate.rs

1//! The `validate` subcommand.
2
3use clap::Parser;
4use clap_verbosity_flag::log::Level;
5use hugr::package::PackageValidationError;
6use hugr::Hugr;
7
8use crate::hugr_io::HugrInputArgs;
9use crate::{CliError, OtherArgs};
10
11/// Validate and visualise a HUGR file.
12#[derive(Parser, Debug)]
13#[clap(version = "1.0", long_about = None)]
14#[clap(about = "Validate a HUGR.")]
15#[group(id = "hugr")]
16#[non_exhaustive]
17pub struct ValArgs {
18    /// Hugr input.
19    #[command(flatten)]
20    pub input_args: HugrInputArgs,
21
22    /// Additional arguments
23    #[command(flatten)]
24    pub other_args: OtherArgs,
25}
26
27/// String to print when validation is successful.
28pub const VALID_PRINT: &str = "HUGR valid!";
29
30impl ValArgs {
31    /// Run the HUGR cli and validate against an extension registry.
32    pub fn run(&mut self) -> Result<Vec<Hugr>, CliError> {
33        let result = match self.input_args.hugr_json {
34            true => {
35                let hugr = self.input_args.get_hugr()?;
36                hugr.validate()
37                    .map_err(PackageValidationError::Validation)?;
38                vec![hugr]
39            }
40            false => {
41                let package = self.input_args.get_package()?;
42                package.validate()?;
43                package.modules
44            }
45        };
46
47        if self.verbosity(Level::Info) {
48            eprintln!("{}", VALID_PRINT);
49        }
50
51        Ok(result)
52    }
53
54    /// Test whether a `level` message should be output.
55    pub fn verbosity(&self, level: Level) -> bool {
56        self.other_args.verbosity(level)
57    }
58}