anstyle_progress/
progress.rs1#[derive(Copy, Clone)]
23pub struct TermProgress {
24 status: Option<TermProgressStatus>,
25 percent: Option<u8>,
26}
27
28impl TermProgress {
29 pub fn none() -> Self {
31 Self {
32 status: None,
33 percent: None,
34 }
35 }
36
37 pub fn start() -> Self {
41 Self::none().status(TermProgressStatus::Normal)
42 }
43
44 pub fn error() -> Self {
46 Self::none().status(TermProgressStatus::Error)
47 }
48
49 pub fn remove() -> Self {
51 Self::none().status(TermProgressStatus::Removed)
52 }
53
54 pub fn percent(mut self, percent: u8) -> Self {
58 assert!(matches!(percent, 0..=100));
59 self.percent = Some(percent);
60 self
61 }
62
63 pub fn status(mut self, status: TermProgressStatus) -> Self {
65 self.status = Some(status);
66 self
67 }
68}
69
70impl Default for TermProgress {
71 fn default() -> Self {
72 Self::none()
73 }
74}
75
76#[allow(missing_docs)]
78#[derive(Copy, Clone)]
79pub enum TermProgressStatus {
80 Removed,
81 Normal,
82 Paused,
84 Error,
85}
86
87impl core::fmt::Display for TermProgress {
88 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
89 let Some(status) = self.status else {
90 return Ok(());
91 };
92 let (st, pr) = match (status, self.percent) {
93 (TermProgressStatus::Removed, _) => (0, None),
94 (TermProgressStatus::Normal, Some(_)) => (1, self.percent),
95 (TermProgressStatus::Error, _) => (2, self.percent),
96 (TermProgressStatus::Normal, None) => (3, None),
97 (TermProgressStatus::Paused, _) => (4, self.percent),
98 };
99 write!(f, "\x1b]9;4;{st};")?;
100 if let Some(pr) = pr {
101 write!(f, "{pr}")?;
102 }
103 write!(f, "\x1b\\")
104 }
105}