Skip to main content

adguardian/widgets/
status.rs

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