use crate::{Editor, Result, RuleSet};
use std::path::Path;
#[derive(Debug)]
pub struct ConvertCommand;
impl ConvertCommand {
pub fn run(input: &Path, output: &Path, target: Option<Editor>) -> Result<()> {
let spinner = super::create_spinner("Loading rules...");
let rules = RuleSet::load(input)?;
spinner.finish_and_clear();
super::print_info(&format!(
"Loaded {} rules from {}",
rules.len(),
input.display()
));
if let Some(editor) = target {
let spinner = super::create_spinner(&format!("Converting to {} format...", editor));
rules.emit(editor, output)?;
spinner.finish_and_clear();
super::print_success(&format!(
"Converted to {} format: {}",
editor,
output.display()
));
} else if output.extension().is_some_and(|ext| ext == "drv") {
let spinner = super::create_spinner("Converting to binary format...");
rules.save_binary(output)?;
spinner.finish_and_clear();
super::print_success(&format!("Converted to binary: {}", output.display()));
} else {
let spinner = super::create_spinner("Converting to markdown...");
rules.emit(Editor::Copilot, output)?;
spinner.finish_and_clear();
super::print_success(&format!("Converted to markdown: {}", output.display()));
}
Ok(())
}
pub fn batch_convert(input: &Path, project_root: &Path, editors: &[Editor]) -> Result<()> {
let rules = RuleSet::load(input)?;
super::print_info(&format!(
"Converting to {} editor formats...",
editors.len()
));
let pb = super::create_progress_bar(editors.len() as u64, "Converting...");
for editor in editors {
let output = project_root.join(editor.rule_path());
rules.emit(*editor, &output)?;
pb.inc(1);
}
pb.finish_with_message("Done!");
super::print_success("All conversions complete");
Ok(())
}
}