Skip to main content

cai_output/
formatter.rs

1//! Core formatter trait and configuration
2
3use cai_core::{Entry, Result};
4use std::io::Write;
5
6/// Configuration for formatters
7#[derive(Debug, Clone, Default)]
8#[non_exhaustive]
9pub struct FormatterConfig {
10    /// Maximum width for table output (0 = no limit)
11    pub max_width: usize,
12    /// Enable colored output where supported
13    pub colorize: bool,
14    /// Truncate long fields to this length (0 = no truncation)
15    pub truncate: usize,
16    /// Number of entries to include (0 = all)
17    pub limit: usize,
18}
19
20/// Core formatter trait for output formats
21pub trait Formatter: Send + Sync {
22    /// Format entries and write to output
23    fn format<W: Write>(&self, entries: &[Entry], writer: &mut W) -> Result<()>;
24
25    /// Format a single entry for streaming output
26    fn format_one<W: Write>(&self, entry: &Entry, writer: &mut W) -> Result<()>;
27
28    /// Get the configuration for this formatter
29    fn config(&self) -> &FormatterConfig;
30
31    /// Set configuration for this formatter
32    fn set_config(&mut self, config: FormatterConfig);
33}
34
35/// Helper trait for formatters that need to truncate text
36pub(crate) trait Truncate {
37    fn truncate_text(&self, text: &str, limit: usize) -> String;
38}
39
40impl Truncate for FormatterConfig {
41    fn truncate_text(&self, text: &str, limit: usize) -> String {
42        if limit == 0 || text.len() <= limit {
43            text.to_string()
44        } else {
45            format!(
46                "{}...",
47                text.chars()
48                    .take(limit.saturating_sub(3))
49                    .collect::<String>()
50            )
51        }
52    }
53}