use crate::generator::context::GeneratorContext;
use anyhow::Result;
use std::path::Path;
use std::process::Stdio;
use tokio::process::Command as TokioCommand;
pub struct MermaidFixer;
impl MermaidFixer {
pub async fn is_available() -> bool {
match TokioCommand::new("mermaid-fixer")
.arg("--version")
.stdout(Stdio::null())
.stderr(Stdio::null())
.status()
.await
{
Ok(status) => status.success(),
Err(_) => false,
}
}
pub async fn fix_mermaid_charts(
context: &GeneratorContext,
target_dir: &Path,
) -> Result<()> {
if !Self::is_available().await {
let msg = context.config.target_language.msg_mermaid_not_installed();
println!("{}", msg);
println!("💡 Tip: Run 'cargo install mermaid-fixer' to install the mermaid fixing tool");
return Ok(());
}
println!("🔧 Starting mermaid chart fixing...");
let mut cmd = TokioCommand::new("mermaid-fixer");
cmd.arg("--directory").arg(target_dir);
let llm_config = &context.config.llm;
cmd.arg("--llm-model").arg(&llm_config.model_powerful);
if !llm_config.api_key.is_empty() {
cmd.arg("--llm-api-key").arg(&llm_config.api_key);
}
if !llm_config.api_base_url.is_empty() {
cmd.arg("--llm-base-url").arg(&llm_config.api_base_url);
}
cmd.arg("--verbose");
cmd.stdout(Stdio::inherit());
cmd.stderr(Stdio::inherit());
println!("🚀 Executing command (showing partial info): mermaid-fixer --directory {} --llm-model {} --verbose",
target_dir.display(),
llm_config.model_powerful);
match cmd.status().await {
Ok(status) => {
if status.success() {
println!("✅ Mermaid chart fixing completed");
} else {
println!("⚠️ mermaid-fixer execution completed but returned non-zero status code: {}",
status.code().unwrap_or(-1));
println!("💡 This may indicate some charts cannot be fixed, but won't affect subsequent processes");
}
}
Err(e) => {
let msg = context.config.target_language.msg_mermaid_error();
println!("{}", msg.replace("{}", &e.to_string()));
println!("💡 Mermaid chart fixing failed, but won't block subsequent processes");
}
}
Ok(())
}
pub async fn auto_fix_after_output(context: &GeneratorContext) -> Result<()> {
let output_dir = &context.config.output_path;
if !output_dir.exists() {
println!("⚠️ Output directory does not exist, skipping mermaid chart fixing");
return Ok(());
}
Self::fix_mermaid_charts(context, output_dir).await
}
}