1use std::io::Write;
3
4use crate::CliError;
5use crate::hugr_io::HugrInputArgs;
6use anyhow::Result;
7use clap::Parser;
8use clio::Output;
9use hugr::HugrView;
10use hugr::package::PackageValidationError;
11
12#[derive(Parser, Debug)]
14#[clap(version = "1.0", long_about = None)]
15#[clap(about = "Render mermaid diagrams..")]
16#[group(id = "hugr")]
17#[non_exhaustive]
18pub struct MermaidArgs {
19 #[command(flatten)]
21 pub input_args: HugrInputArgs,
22
23 #[arg(
25 long,
26 help = "Validate before rendering, includes extension inference."
27 )]
28 pub validate: bool,
29 #[clap(long, short, value_parser, default_value = "-")]
31 output: Output,
32}
33
34impl MermaidArgs {
35 pub fn run_print(&mut self) -> Result<()> {
37 if self.input_args.hugr_json {
38 self.run_print_hugr()
39 } else {
40 self.run_print_envelope()
41 }
42 }
43
44 pub fn run_print_envelope(&mut self) -> Result<()> {
46 let package = self.input_args.get_package()?;
47 let generator = hugr::envelope::get_generator(&package.modules);
48
49 if self.validate {
50 package
51 .validate()
52 .map_err(|val_err| CliError::validation(generator, val_err))?;
53 }
54
55 for hugr in package.modules {
56 writeln!(self.output, "{}", hugr.mermaid_string())?;
57 }
58 Ok(())
59 }
60
61 pub fn run_print_hugr(&mut self) -> Result<()> {
63 #[allow(deprecated)]
64 let hugr = self.input_args.get_hugr()?;
65
66 if self.validate {
67 hugr.validate()
68 .map_err(PackageValidationError::Validation)?;
69 }
70
71 writeln!(self.output, "{}", hugr.mermaid_string())?;
72 Ok(())
73 }
74}