adguardian/widgets/
status.rs

1use tui::{
2  style::{Color, Style, Modifier},
3  text::{Span, Spans},
4  widgets::{Paragraph, Wrap, Borders, Block},
5};
6
7use crate::fetch::fetch_status::StatusResponse;
8use crate::fetch::fetch_stats::StatsResponse;
9
10pub fn render_status_paragraph<'a>(status: &'a StatusResponse, stats: &'a StatsResponse) -> Paragraph<'a> {
11
12  let block = Block::default()
13        .borders(Borders::ALL)
14        .title(Span::styled(
15            "Status",
16            Style::default().add_modifier(Modifier::BOLD),
17        ));
18
19    let get_color = |enabled: bool| {
20      if enabled { Color::Green } else { Color::Red }
21    };
22
23    let value_style = Style::default().fg(Color::Blue).add_modifier(Modifier::BOLD);
24
25    let coloured = |color: Color| {
26      Style::default().fg(color).add_modifier(Modifier::BOLD)
27    };
28      
29
30  let text = vec![
31      Spans::from(vec![
32        Span::styled("Running: ", Style::default()),
33        Span::styled(
34            format!("{}", status.running),
35            Style::default().fg(get_color(status.running)).add_modifier(Modifier::BOLD)
36        ),
37    ]),
38      Spans::from(vec![
39        Span::styled("Protection Enabled: ", Style::default()),
40        Span::styled(
41            format!("{}", status.protection_enabled),
42            Style::default().fg(get_color(status.protection_enabled)).add_modifier(Modifier::BOLD)
43        ),
44    ]),
45      Spans::from(vec![
46        Span::styled("DHCP Available: ", Style::default()),
47        Span::styled(
48            format!("{}", status.dhcp_available),
49            Style::default().fg(get_color(status.dhcp_available)).add_modifier(Modifier::BOLD)
50        ),
51    ]),
52    Spans::from(vec![
53      Span::styled("Avg Processing Time: ", Style::default()),
54      Span::styled(format!("{}ms", (stats.avg_processing_time * 1000.0) as i16), value_style),
55    ]),
56    Spans::from(vec![
57      Span::styled("Version: ", Style::default()),
58      Span::styled(status.version.to_string(), value_style),
59    ]),
60    Spans::from(vec![
61        Span::styled("Ports: ", Style::default()),
62        Span::styled(format!(":{} (DNS), :{} (HTTP)", status.dns_port, status.http_port), value_style),
63    ]),
64    Spans::from(vec![
65      Span::styled("Total Queries: ", Style::default()),
66      Span::styled(stats.num_dns_queries.to_string(), coloured(Color::Green)),
67    ]),
68    Spans::from(vec![
69      Span::styled("Filtered: ", Style::default()),
70      Span::styled(stats.num_blocked_filtering.to_string(), coloured(Color::Yellow)),
71    ]),
72    Spans::from(vec![
73      Span::styled("Malware Blocked: ", Style::default()),
74      Span::styled(stats.num_replaced_safebrowsing.to_string(), coloured(Color::Red)),
75    ]),
76    Spans::from(vec![
77      Span::styled("Parental Controls: ", Style::default()),
78      Span::styled(stats.num_replaced_parental.to_string(), coloured(Color::Magenta)),
79    ]),
80    Spans::from(vec![
81      Span::styled("Safe Search: ", Style::default()),
82      Span::styled(stats.num_replaced_safesearch.to_string(), coloured(Color::Cyan)),
83    ]),
84  ];
85  Paragraph::new(text)
86    .wrap(Wrap { trim: true })
87    .block(block)
88}