Skip to main content

sift_core/search/output/
format.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2pub enum ColumnOverflow {
3    Omit,
4    Preview,
5}
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub struct ColumnLimit {
9    pub max: u64,
10    pub overflow: ColumnOverflow,
11}
12
13pub enum ColumnAction {
14    Normal,
15    Omit,
16    Preview,
17}
18
19impl ColumnLimit {
20    #[must_use]
21    pub fn classify(&self, line: &[u8]) -> ColumnAction {
22        let trimmed = line.strip_suffix(b"\n").unwrap_or(line);
23        let trimmed = trimmed.strip_suffix(b"\r").unwrap_or(trimmed);
24        if trimmed.len() as u64 > self.max {
25            match self.overflow {
26                ColumnOverflow::Preview => ColumnAction::Preview,
27                ColumnOverflow::Omit => ColumnAction::Omit,
28            }
29        } else {
30            ColumnAction::Normal
31        }
32    }
33
34    #[must_use]
35    pub fn truncate(&self, line: &[u8]) -> Vec<u8> {
36        let trimmed = line.strip_suffix(b"\n").unwrap_or(line);
37        let trimmed = trimmed.strip_suffix(b"\r").unwrap_or(trimmed);
38        let limit = usize::try_from(self.max).unwrap_or(usize::MAX);
39        let mut out = Vec::with_capacity(limit.saturating_add(30));
40        out.extend_from_slice(&trimmed[..limit.min(trimmed.len())]);
41        out.extend_from_slice(b" [... omitted end ...]");
42        out.push(b'\n');
43        out
44    }
45}