1use clap::{Parser, crate_version};
23use clap_verbosity_flag::{InfoLevel, Verbosity};
24use hugr::envelope::EnvelopeError;
25use hugr::package::PackageValidationError;
26use std::ffi::OsString;
27use thiserror::Error;
28
29pub mod convert;
30pub mod extensions;
31pub mod hugr_io;
32pub mod mermaid;
33pub mod validate;
34
35#[derive(Parser, Debug)]
37#[clap(version = crate_version!(), long_about = None)]
38#[clap(about = "HUGR CLI tools.")]
39#[group(id = "hugr")]
40pub struct CliArgs {
41 #[command(subcommand)]
43 pub command: CliCommand,
44 #[command(flatten)]
46 pub verbose: Verbosity<InfoLevel>,
47}
48
49#[derive(Debug, clap::Subcommand)]
51#[non_exhaustive]
52pub enum CliCommand {
53 Validate(validate::ValArgs),
55 GenExtensions(extensions::ExtArgs),
57 Mermaid(mermaid::MermaidArgs),
59 Convert(convert::ConvertArgs),
61 #[command(external_subcommand)]
63 External(Vec<OsString>),
64}
65
66#[derive(Debug, Error)]
68#[non_exhaustive]
69pub enum CliError {
70 #[error("Error reading from path.")]
72 InputFile(#[from] std::io::Error),
73 #[error("Error parsing package.")]
75 Parse(#[from] serde_json::Error),
76 #[error("Error validating HUGR.")]
77 Validate(#[from] PackageValidationError),
79 #[error("Error decoding HUGR envelope.")]
80 Envelope(#[from] EnvelopeError),
82 #[error(
84 "Input file is not a HUGR envelope. Invalid magic number.\n\nUse `--hugr-json` to read a raw HUGR JSON file instead."
85 )]
86 NotAnEnvelope,
87 #[error(
89 "Invalid format: '{_0}'. Valid formats are: json, model, model-exts, model-text, model-text-exts"
90 )]
91 InvalidFormat(String),
92 #[error("Error validating HUGR generated by {generator}")]
93 ValidateKnownGenerator {
95 #[source]
96 inner: PackageValidationError,
98 generator: Box<String>,
100 },
101}
102
103impl CliError {
104 pub fn validation(generator: Option<String>, val_err: PackageValidationError) -> Self {
106 if let Some(g) = generator {
107 Self::ValidateKnownGenerator {
108 inner: val_err,
109 generator: Box::new(g.to_string()),
110 }
111 } else {
112 Self::Validate(val_err)
113 }
114 }
115}