use std::io::{Read, Write};
use crate::CliError;
use crate::hugr_io::HugrInputArgs;
use anyhow::Result;
use clap::Parser;
use clio::Output;
use hugr::HugrView;
use hugr::package::PackageValidationError;
#[derive(Parser, Debug)]
#[clap(version = "1.0", long_about = None)]
#[clap(about = "Render mermaid diagrams..")]
#[group(id = "hugr")]
#[non_exhaustive]
pub struct MermaidArgs {
#[command(flatten)]
pub input_args: HugrInputArgs,
#[arg(
long,
help = "Validate before rendering, includes extension inference."
)]
pub validate: bool,
#[clap(long, short, value_parser, default_value = "-")]
output: Output,
}
impl MermaidArgs {
pub fn run_print_with_io<R: Read, W: Write>(
&mut self,
input_override: Option<R>,
output_override: Option<W>,
) -> Result<()> {
self.run_print_envelope_with_io(input_override, output_override)
}
fn run_print_envelope_with_io<R: Read, W: Write>(
&mut self,
input_override: Option<R>,
mut output_override: Option<W>,
) -> Result<()> {
let (desc, package) = self
.input_args
.get_described_package_with_reader(input_override)?;
let generator = desc.generator();
if self.validate {
package
.validate()
.map_err(|val_err| CliError::validation(generator, val_err))?;
}
for hugr in package.modules {
if let Some(ref mut writer) = output_override {
writeln!(writer, "{}", hugr.mermaid_string())?;
} else {
writeln!(self.output, "{}", hugr.mermaid_string())?;
}
}
Ok(())
}
#[expect(deprecated)]
fn run_print_hugr_with_io<R: Read, W: Write>(
&mut self,
input_override: Option<R>,
mut output_override: Option<W>,
) -> Result<()> {
let hugr = self.input_args.get_hugr_with_reader(input_override)?;
if self.validate {
hugr.validate()
.map_err(PackageValidationError::Validation)?;
}
if let Some(ref mut writer) = output_override {
writeln!(writer, "{}", hugr.mermaid_string())?;
} else {
writeln!(self.output, "{}", hugr.mermaid_string())?;
}
Ok(())
}
pub fn run_print(&mut self) -> Result<()> {
self.run_print_with_io(None::<&[u8]>, None::<Vec<u8>>)
}
pub fn run_print_envelope(&mut self) -> Result<()> {
self.run_print_envelope_with_io(None::<&[u8]>, None::<Vec<u8>>)
}
#[deprecated(since = "0.27.0")]
pub fn run_print_hugr(&mut self) -> Result<()> {
self.run_print_hugr_with_io(None::<&[u8]>, None::<Vec<u8>>)
}
}