sift_core/search/output/
format.rs1#[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}