stynx_code_tui/state/
toast_state.rs1use 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}