1use crate::{Editor, Result, RuleSet};
4use std::path::Path;
5
6#[derive(Debug)]
8pub struct ConvertCommand;
9
10impl ConvertCommand {
11 pub fn run(input: &Path, output: &Path, target: Option<Editor>) -> Result<()> {
13 let spinner = super::create_spinner("Loading rules...");
15 let rules = RuleSet::load(input)?;
16 spinner.finish_and_clear();
17
18 super::print_info(&format!(
19 "Loaded {} rules from {}",
20 rules.len(),
21 input.display()
22 ));
23
24 if let Some(editor) = target {
26 let spinner = super::create_spinner(&format!("Converting to {} format...", editor));
28 rules.emit(editor, output)?;
29 spinner.finish_and_clear();
30
31 super::print_success(&format!(
32 "Converted to {} format: {}",
33 editor,
34 output.display()
35 ));
36 } else if output.extension().is_some_and(|ext| ext == "drv") {
37 let spinner = super::create_spinner("Converting to binary format...");
39 rules.save_binary(output)?;
40 spinner.finish_and_clear();
41
42 super::print_success(&format!("Converted to binary: {}", output.display()));
43 } else {
44 let spinner = super::create_spinner("Converting to markdown...");
46 rules.emit(Editor::Copilot, output)?;
47 spinner.finish_and_clear();
48
49 super::print_success(&format!("Converted to markdown: {}", output.display()));
50 }
51
52 Ok(())
53 }
54
55 pub fn batch_convert(input: &Path, project_root: &Path, editors: &[Editor]) -> Result<()> {
57 let rules = RuleSet::load(input)?;
58
59 super::print_info(&format!(
60 "Converting to {} editor formats...",
61 editors.len()
62 ));
63
64 let pb = super::create_progress_bar(editors.len() as u64, "Converting...");
65
66 for editor in editors {
67 let output = project_root.join(editor.rule_path());
68 rules.emit(*editor, &output)?;
69 pb.inc(1);
70 }
71
72 pb.finish_with_message("Done!");
73 super::print_success("All conversions complete");
74
75 Ok(())
76 }
77}