adguardian/widgets/
status.rs1use 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}