context_creator/formatters/
plain.rs

1//! Plain text formatter for context generation
2
3use super::{DigestData, DigestFormatter};
4use crate::core::walker::FileInfo;
5use anyhow::Result;
6
7/// Formatter that outputs plain text format
8pub struct PlainFormatter {
9    buffer: String,
10}
11
12impl PlainFormatter {
13    /// Create a new PlainFormatter
14    pub fn new() -> Self {
15        Self {
16            buffer: String::new(),
17        }
18    }
19}
20
21impl Default for PlainFormatter {
22    fn default() -> Self {
23        Self::new()
24    }
25}
26
27impl DigestFormatter for PlainFormatter {
28    fn render_header(&mut self, _data: &DigestData) -> Result<()> {
29        self.buffer
30            .push_str("================================================================\n");
31        self.buffer.push_str("Code Digest\n");
32        self.buffer
33            .push_str("================================================================\n\n");
34        Ok(())
35    }
36
37    fn render_statistics(&mut self, data: &DigestData) -> Result<()> {
38        self.buffer.push_str("File Summary:\n");
39        self.buffer
40            .push_str(&format!("Total files: {}\n\n", data.files.len()));
41        Ok(())
42    }
43
44    fn render_file_tree(&mut self, _data: &DigestData) -> Result<()> {
45        // File tree not needed for basic plain format
46        Ok(())
47    }
48
49    fn render_toc(&mut self, _data: &DigestData) -> Result<()> {
50        // Table of contents not needed for basic plain format
51        Ok(())
52    }
53
54    fn render_file_details(&mut self, file: &FileInfo, data: &DigestData) -> Result<()> {
55        self.buffer
56            .push_str("----------------------------------------------------------------\n");
57        self.buffer
58            .push_str(&format!("File: {}\n", file.relative_path.display()));
59        self.buffer
60            .push_str("----------------------------------------------------------------\n\n");
61
62        // Read and add file content
63        if let Ok(content) = data.cache.get_or_load(&file.path) {
64            self.buffer.push_str(&content);
65            self.buffer.push_str("\n\n");
66        }
67        Ok(())
68    }
69
70    fn finalize(self: Box<Self>) -> String {
71        self.buffer
72    }
73
74    fn format_name(&self) -> &'static str {
75        "plain"
76    }
77}