Skip to main content

stynx_code_tui/state/
toast_state.rs

1use std::time::{Duration, Instant};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum ToastKind {
5    Info,
6    Success,
7    Warning,
8    Error,
9}
10
11#[derive(Debug, Clone)]
12pub struct Toast {
13    pub message: String,
14    pub kind: ToastKind,
15    pub expires_at: Instant,
16}
17
18#[derive(Default)]
19pub struct ToastState {
20    pub items: Vec<Toast>,
21}
22
23impl ToastState {
24    pub fn new() -> Self {
25        Self { items: Vec::new() }
26    }
27
28    pub fn push(&mut self, message: impl Into<String>, kind: ToastKind, ttl: Duration) {
29        let toast = Toast {
30            message: message.into(),
31            kind,
32            expires_at: Instant::now() + ttl,
33        };
34        self.items.push(toast);
35        if self.items.len() > 4 {
36            self.items.remove(0);
37        }
38    }
39
40    pub fn info(&mut self, message: impl Into<String>) {
41        self.push(message, ToastKind::Info, Duration::from_secs(3));
42    }
43
44    pub fn success(&mut self, message: impl Into<String>) {
45        self.push(message, ToastKind::Success, Duration::from_secs(3));
46    }
47
48    pub fn warn(&mut self, message: impl Into<String>) {
49        self.push(message, ToastKind::Warning, Duration::from_secs(4));
50    }
51
52    pub fn error(&mut self, message: impl Into<String>) {
53        self.push(message, ToastKind::Error, Duration::from_secs(5));
54    }
55
56    pub fn tick(&mut self) {
57        let now = Instant::now();
58        self.items.retain(|t| t.expires_at > now);
59    }
60}