synd-term 0.3.2

terminal feed viewer
Documentation
use std::{str::FromStr, sync::OnceLock};

use ratatui::style::{Color, Modifier};
use synd_feed::types::{Category, Requirement};

use crate::{
    application::{InFlight, TerminalFocus},
    config::{Categories, Icon, IconColor},
    types::Time,
    ui::{components::tabs::Tab, theme::Theme},
};

pub mod components;
pub mod extension;
pub mod theme;
pub mod widgets;

mod icon;
pub(crate) use icon::icon;

pub const UNKNOWN_SYMBOL: &str = "-";
pub const TABLE_HIGHLIGHT_SYMBOL: &str = "";
pub const DEFAULT_REQUIREMNET: Requirement = Requirement::Should;

pub fn default_category() -> &'static Category<'static> {
    static DEFAULT_CATEGORY: OnceLock<Category<'static>> = OnceLock::new();

    DEFAULT_CATEGORY.get_or_init(|| Category::new("default").unwrap())
}

pub fn default_icon() -> &'static Icon {
    static DEFAULT_ICON: OnceLock<Icon> = OnceLock::new();

    DEFAULT_ICON.get_or_init(|| {
        Icon::new("󰎞").with_color(IconColor::new(Color::from_str("dark gray").unwrap()))
    })
}

pub struct Context<'a> {
    pub theme: &'a Theme,
    pub in_flight: &'a InFlight,
    pub categories: &'a Categories,
    pub(crate) now: Time,
    pub(crate) focus: TerminalFocus,
    pub(crate) tab: Tab,
}

impl Context<'_> {
    fn table_highlight_modifier(&self) -> Modifier {
        match self.focus {
            TerminalFocus::Gained => Modifier::empty(),
            TerminalFocus::Lost => Modifier::DIM,
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn default_icon_is_not_empty() {
        assert!(!default_icon().symbol().is_empty());
    }
}