hugr_cli/
mermaid.rs

1//! Render mermaid diagrams.
2use 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/// Dump the standard extensions.
13#[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    /// Hugr input.
20    #[command(flatten)]
21    pub input_args: HugrInputArgs,
22
23    /// Validate package.
24    #[arg(
25        long,
26        help = "Validate before rendering, includes extension inference."
27    )]
28    pub validate: bool,
29    /// Output file '-' for stdout
30    #[clap(long, short, value_parser, default_value = "-")]
31    output: Output,
32}
33
34impl MermaidArgs {
35    /// Write the mermaid diagram to the output.
36    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    /// Write the mermaid diagram for a HUGR envelope.
45    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    /// Write the mermaid diagram for a legacy HUGR json.
62    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}