1use std::{str::FromStr, sync::OnceLock};
2
3use ratatui::style::{Color, Modifier};
4use synd_feed::types::{Category, Requirement};
5
6use crate::{
7 application::{InFlight, TerminalFocus},
8 config::{Categories, Icon, IconColor},
9 types::Time,
10 ui::{components::tabs::Tab, theme::Theme},
11};
12
13pub mod components;
14pub mod extension;
15pub mod theme;
16pub mod widgets;
17
18mod icon;
19pub(crate) use icon::icon;
20
21pub const UNKNOWN_SYMBOL: &str = "-";
22pub const TABLE_HIGHLIGHT_SYMBOL: &str = " ";
23pub const DEFAULT_REQUIREMNET: Requirement = Requirement::Should;
24
25pub fn default_category() -> &'static Category<'static> {
26 static DEFAULT_CATEGORY: OnceLock<Category<'static>> = OnceLock::new();
27
28 DEFAULT_CATEGORY.get_or_init(|| Category::new("default").unwrap())
29}
30
31pub fn default_icon() -> &'static Icon {
32 static DEFAULT_ICON: OnceLock<Icon> = OnceLock::new();
33
34 DEFAULT_ICON.get_or_init(|| {
35 Icon::new("").with_color(IconColor::new(Color::from_str("dark gray").unwrap()))
36 })
37}
38
39pub struct Context<'a> {
40 pub theme: &'a Theme,
41 pub in_flight: &'a InFlight,
42 pub categories: &'a Categories,
43 pub(crate) now: Time,
44 pub(crate) focus: TerminalFocus,
45 pub(crate) tab: Tab,
46}
47
48impl Context<'_> {
49 fn table_highlight_modifier(&self) -> Modifier {
50 match self.focus {
51 TerminalFocus::Gained => Modifier::empty(),
52 TerminalFocus::Lost => Modifier::DIM,
53 }
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn default_icon_is_not_empty() {
63 assert!(!default_icon().symbol().is_empty());
64 }
65}