Skip to main content

driven/cli/
convert.rs

1//! Convert command - convert rules between formats
2
3use crate::{Editor, Result, RuleSet};
4use std::path::Path;
5
6/// Convert command handler
7#[derive(Debug)]
8pub struct ConvertCommand;
9
10impl ConvertCommand {
11    /// Convert rules from one format to another
12    pub fn run(input: &Path, output: &Path, target: Option<Editor>) -> Result<()> {
13        // Load input
14        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        // Convert based on output format
25        if let Some(editor) = target {
26            // Emit to editor format
27            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            // Convert to binary
38            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            // Convert to markdown (default)
45            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    /// Batch convert to all editor formats
56    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}