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, HugrView};
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 = if self.input_args.hugr_json {
34            let hugr = self.input_args.get_hugr()?;
35            hugr.validate()
36                .map_err(PackageValidationError::Validation)?;
37            vec![hugr]
38        } else {
39            let package = self.input_args.get_package()?;
40            package.validate()?;
41            package.modules
42        };
43
44        if self.verbosity(Level::Info) {
45            eprintln!("{VALID_PRINT}");
46        }
47
48        Ok(result)
49    }
50
51    /// Test whether a `level` message should be output.
52    #[must_use]
53    pub fn verbosity(&self, level: Level) -> bool {
54        self.other_args.verbosity(level)
55    }
56}