use serde::Serialize;
#[derive(Debug, PartialEq, Eq, Serialize)]
pub struct PeekResult {
pub opening_lines: String,
pub truncated_count: Option<usize>,
pub closing_lines: Option<String>,
}
pub fn format_as_peek(raw_content: &str, peek_line_num: usize) -> PeekResult {
let non_blank_lines: Vec<&str> = raw_content
.lines()
.filter(|line| !line.trim().is_empty())
.collect();
let total_lines = non_blank_lines.len();
let threshold = (peek_line_num * 2) + 3;
if total_lines <= threshold {
return PeekResult {
opening_lines: non_blank_lines.join("\n"),
truncated_count: None,
closing_lines: None,
};
}
let opening = non_blank_lines[..peek_line_num].join("\n");
let closing = non_blank_lines[total_lines - peek_line_num..].join("\n");
let truncated_cnt = total_lines - (peek_line_num * 2);
PeekResult {
opening_lines: opening,
truncated_count: Some(truncated_cnt),
closing_lines: Some(closing),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_peek_empty() {
let res = format_as_peek("", 3);
assert_eq!(res.opening_lines, "");
assert_eq!(res.truncated_count, None);
assert_eq!(res.closing_lines, None);
}
#[test]
fn test_peek_short_no_truncation() {
let content = "One\nTwo\nThree\nFour\nFive";
let res = format_as_peek(content, 3);
assert_eq!(res.opening_lines, "One\nTwo\nThree\nFour\nFive");
assert_eq!(res.truncated_count, None);
assert_eq!(res.closing_lines, None);
}
#[test]
fn test_peek_strips_blanks() {
let content = "One\n\nTwo\n \nThree";
let res = format_as_peek(content, 3);
assert_eq!(res.opening_lines, "One\nTwo\nThree");
assert_eq!(res.truncated_count, None);
}
#[test]
fn test_peek_exact_threshold() {
let lines: Vec<String> = (1..=9).map(|i| i.to_string()).collect();
let content = lines.join("\n");
let res = format_as_peek(&content, 3);
assert_eq!(res.opening_lines, content); assert_eq!(res.truncated_count, None);
}
#[test]
fn test_peek_truncation() {
let lines: Vec<String> = (1..=10).map(|i| i.to_string()).collect();
let content = lines.join("\n");
let res = format_as_peek(&content, 3);
assert_eq!(res.opening_lines, "1\n2\n3");
assert_eq!(res.truncated_count, Some(4));
assert_eq!(res.closing_lines, Some("8\n9\n10".to_string()));
}
}