adguard-tui 1.0.0

Terminal-based, real-time traffic monitoring and statistics for your AdGuard Home instance
// filters.rs

use tui::{
    style::{Color, Modifier, Style},
    text::{Line, Span},
    widgets::{Block, Borders, List, ListItem},
};

use crate::fetch::fetch_filters::Filter;

fn truncate(text: &str, width: usize) -> String {
    if text.chars().count() <= width {
        text.to_string()
    } else {
        text.chars().take(width - 3).collect::<String>() + "..."
    }
}

pub fn make_filters_list(filters: &[Filter], width: u16) -> List {
    let items: Vec<ListItem> = filters
        .iter()
        .map(|filter| {
            let (status_text, color) = if filter.enabled {
                ("", Color::Green)
            } else {
                ("", Color::Red)
            };
            let status = Span::styled(status_text, Style::default().fg(color));
            let rule_count = Span::styled(
                format!(" ({})", filter.rules_count),
                Style::default()
                    .fg(Color::Magenta)
                    .add_modifier(Modifier::BOLD),
            );
            let name = Span::raw(format!(
                " {}",
                truncate(&filter.name, width as usize / 4 - 12)
            ));
            let content = Line::from(vec![status, name, rule_count]);
            ListItem::new(content)
        })
        .collect();

    List::new(items).block(Block::default().borders(Borders::ALL).title(Span::styled(
        "Filters",
        Style::default().add_modifier(Modifier::BOLD),
    )))
}