1use clio::Input;
4use hugr::envelope::read_envelope;
5use hugr::extension::ExtensionRegistry;
6use hugr::package::Package;
7use hugr::{Extension, Hugr};
8use std::io::BufReader;
9use std::path::PathBuf;
10
11use crate::CliError;
12
13#[derive(Debug, clap::Args)]
15pub struct HugrInputArgs {
16 #[arg(value_parser, default_value = "-", help_heading = "Input")]
18 pub input: Input,
19
20 #[arg(
22 long,
23 help_heading = "Input",
24 help = "Don't use standard extensions when validating hugrs. Prelude is still used."
25 )]
26 pub no_std: bool,
27 #[arg(
29 short,
30 long,
31 help_heading = "Input",
32 help = "Paths to serialised extensions to validate against."
33 )]
34 pub extensions: Vec<PathBuf>,
35 #[clap(long, help_heading = "Input")]
39 pub hugr_json: bool,
40}
41
42impl HugrInputArgs {
43 pub fn get_package(&mut self) -> Result<Package, CliError> {
49 let extensions = self.load_extensions()?;
50 let buffer = BufReader::new(&mut self.input);
51 let (_, pkg) = read_envelope(buffer, &extensions)?;
52 Ok(pkg)
53 }
54
55 pub fn get_hugr(&mut self) -> Result<Hugr, CliError> {
60 let extensions = self.load_extensions()?;
61 let mut buffer = BufReader::new(&mut self.input);
62 let hugr = Hugr::load_json(&mut buffer, &extensions)?;
63 Ok(hugr)
64 }
65
66 pub fn load_extensions(&self) -> Result<ExtensionRegistry, CliError> {
71 let mut reg = if self.no_std {
72 hugr::extension::PRELUDE_REGISTRY.to_owned()
73 } else {
74 hugr::std_extensions::STD_REG.to_owned()
75 };
76
77 for ext in &self.extensions {
78 let f = std::fs::File::open(ext)?;
79 let ext: Extension = serde_json::from_reader(f)?;
80 reg.register_updated(ext);
81 }
82
83 Ok(reg)
84 }
85}