http-diff 0.0.5

http-diff - CLI tool to verify consistency across web server versions. Ideal for large-scale refactors, sanity tests and maintaining data integrity across versions.
use crossterm::style::StyledContent;

pub fn collapse_str(
    input: StyledContent<String>,
    max_length: usize,
) -> StyledContent<String> {
    let content = input.content().clone();

    let collapsed_text = if content.len() > max_length {
        let collapsed: String = content.chars().take(max_length - 3).collect();

        format!("{}...", collapsed)
    } else {
        content
    };

    let text = if collapsed_text.len() < max_length {
        let padding = max_length - collapsed_text.len();

        format!("{}{}", collapsed_text, " ".repeat(padding))
    } else {
        collapsed_text
    };

    return crossterm::style::StyledContent::new(input.style().clone(), text);
}

pub fn print_table_row(
    cells: Vec<StyledContent<String>>,
    with_underline: bool,
) {
    let column_width = 25;

    let cells_count = cells.len();

    let mut row_length = 0;

    for (index, cell) in cells.into_iter().enumerate() {
        let is_last_cell = index == cells_count - 1;
        let text = collapse_str(cell, column_width);

        row_length += text.content().len();

        let output = if is_last_cell {
            format!("{: <width$}", text, width = column_width)
        } else {
            row_length += 3;
            format!("{: <width$} | ", text, width = column_width)
        };

        print!("{}", output);
    }

    if with_underline {
        println!("\n{}", "-".repeat(row_length));
    } else {
        println!();
    }
}

#[test]
pub fn test_collapse_str() {
    use crossterm::style::Stylize;

    let test_cases = vec![
        (
            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, se"
                .to_owned(),
            20,
            "Lorem ipsum dolor...".to_owned(),
        ),
        (
            "Lorem ipsum dolor".to_owned(),
            20,
            "Lorem ipsum dolor   ".to_owned(),
        ),
        (
            "Lorem ipsum dolor si".to_owned(),
            20,
            "Lorem ipsum dolor si".to_owned(),
        ),
        ("".to_owned(), 20, "                    ".to_owned()),
    ];

    for (input, max_length, expected) in test_cases {
        let actual = collapse_str(input.white(), max_length);

        assert_eq!(actual, expected.white())
    }
}