From caf6ebea1e448547ba54cdfba25152b4759d14cd Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 16 Mar 2026 11:51:20 -0500 Subject: [PATCH 1/8] docs(progress): Clarify None percent --- crates/anstyle-progress/src/progress.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/anstyle-progress/src/progress.rs b/crates/anstyle-progress/src/progress.rs index 1e0634f..649c150 100644 --- a/crates/anstyle-progress/src/progress.rs +++ b/crates/anstyle-progress/src/progress.rs @@ -41,6 +41,8 @@ impl TermProgress { } /// Between `0..=100` + /// + /// When `None`, will report an indeterminate status pub fn percent(mut self, percent: Option) -> Self { assert!(matches!(percent, Some(0..=100) | None)); self.percent = percent; From b3ae2874021007258cb0b9756906a8da1ebc842c Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 16 Mar 2026 11:51:37 -0500 Subject: [PATCH 2/8] feat(progress): Add progress helper --- crates/anstyle-progress/src/progress.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/crates/anstyle-progress/src/progress.rs b/crates/anstyle-progress/src/progress.rs index 649c150..e287962 100644 --- a/crates/anstyle-progress/src/progress.rs +++ b/crates/anstyle-progress/src/progress.rs @@ -5,8 +5,7 @@ /// ```rust /// # use anstyle_progress::TermProgress; /// # use anstyle_progress::TermProgressStatus; -/// let mut progress = anstyle_progress::TermProgress::none() -/// .status(TermProgressStatus::Normal); +/// let mut progress = anstyle_progress::TermProgress::start(); /// /// let progress = progress.percent(Some(0)); /// println!("{progress}"); @@ -34,6 +33,13 @@ impl TermProgress { } } + /// Start a progress indicator + /// + /// This starts in an indeterminate state + pub fn start() -> Self { + Self::none().status(TermProgressStatus::Normal) + } + /// Change the reported status pub fn status(mut self, status: TermProgressStatus) -> Self { self.status = Some(status); From 6de4da35b15ab43de275aac10b20e093346ff20b Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 16 Mar 2026 11:54:54 -0500 Subject: [PATCH 3/8] fix(progress): Only include percent when needed --- crates/anstyle-progress/src/progress.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/crates/anstyle-progress/src/progress.rs b/crates/anstyle-progress/src/progress.rs index e287962..73e47e3 100644 --- a/crates/anstyle-progress/src/progress.rs +++ b/crates/anstyle-progress/src/progress.rs @@ -77,14 +77,17 @@ impl core::fmt::Display for TermProgress { let Some(status) = self.status else { return Ok(()); }; - let st = match (f.alternate(), status, self.percent) { - (true, _, _) => 0, - (false, TermProgressStatus::Normal, Some(_)) => 1, - (false, TermProgressStatus::Error, _) => 2, - (false, TermProgressStatus::Normal, None) => 3, - (false, TermProgressStatus::Paused, _) => 4, + let (st, pr) = match (f.alternate(), status, self.percent) { + (true, _, _) => (0, None), + (false, TermProgressStatus::Normal, Some(_)) => (1, self.percent), + (false, TermProgressStatus::Error, _) => (2, self.percent), + (false, TermProgressStatus::Normal, None) => (3, None), + (false, TermProgressStatus::Paused, _) => (4, self.percent), }; - let pr = self.percent.unwrap_or(0); - write!(f, "\x1b]9;4;{st};{pr}\x1b\\") + write!(f, "\x1b]9;4;{st}")?; + if let Some(pr) = pr { + write!(f, ";{pr}")?; + } + write!(f, "\x1b\\") } } From 3177a7dbf1d2c9740b0403a461e73f0222e7b55e Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 16 Mar 2026 11:55:49 -0500 Subject: [PATCH 4/8] fix(progress): Add error helper --- crates/anstyle-progress/src/progress.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/anstyle-progress/src/progress.rs b/crates/anstyle-progress/src/progress.rs index 73e47e3..a98c522 100644 --- a/crates/anstyle-progress/src/progress.rs +++ b/crates/anstyle-progress/src/progress.rs @@ -40,6 +40,11 @@ impl TermProgress { Self::none().status(TermProgressStatus::Normal) } + /// Start an error indicator + pub fn error() -> Self { + Self::none().status(TermProgressStatus::Error) + } + /// Change the reported status pub fn status(mut self, status: TermProgressStatus) -> Self { self.status = Some(status); From 9f4e81c0619ea207c3d83758d2cf0631f1d4915b Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 16 Mar 2026 12:01:51 -0500 Subject: [PATCH 5/8] fix(progress)!: Use explicit Removed status This replaces the use of `alternate`. `alternate` doesn't work as well for programmatic use. --- crates/anstyle-progress/src/progress.rs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/crates/anstyle-progress/src/progress.rs b/crates/anstyle-progress/src/progress.rs index a98c522..c77b1ac 100644 --- a/crates/anstyle-progress/src/progress.rs +++ b/crates/anstyle-progress/src/progress.rs @@ -16,7 +16,8 @@ /// let progress = progress.percent(Some(100)); /// println!("{progress}"); /// -/// println!("{progress:#}"); +/// let progress = progress.remove(); +/// println!("{progress}"); /// ``` #[derive(Copy, Clone)] pub struct TermProgress { @@ -45,6 +46,13 @@ impl TermProgress { Self::none().status(TermProgressStatus::Error) } + /// Remove the indicator + pub fn remove(mut self) -> Self { + self.status = Some(TermProgressStatus::Removed); + self.percent = None; + self + } + /// Change the reported status pub fn status(mut self, status: TermProgressStatus) -> Self { self.status = Some(status); @@ -71,6 +79,7 @@ impl Default for TermProgress { #[allow(missing_docs)] #[derive(Copy, Clone)] pub enum TermProgressStatus { + Removed, Normal, /// Some terminals treat this as a Warning Paused, @@ -82,12 +91,12 @@ impl core::fmt::Display for TermProgress { let Some(status) = self.status else { return Ok(()); }; - let (st, pr) = match (f.alternate(), status, self.percent) { - (true, _, _) => (0, None), - (false, TermProgressStatus::Normal, Some(_)) => (1, self.percent), - (false, TermProgressStatus::Error, _) => (2, self.percent), - (false, TermProgressStatus::Normal, None) => (3, None), - (false, TermProgressStatus::Paused, _) => (4, self.percent), + let (st, pr) = match (status, self.percent) { + (TermProgressStatus::Removed, _) => (0, None), + (TermProgressStatus::Normal, Some(_)) => (1, self.percent), + (TermProgressStatus::Error, _) => (2, self.percent), + (TermProgressStatus::Normal, None) => (3, None), + (TermProgressStatus::Paused, _) => (4, self.percent), }; write!(f, "\x1b]9;4;{st}")?; if let Some(pr) = pr { From cefc95f16db9766badf5c92051ebb50faf31ee05 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 16 Mar 2026 12:09:38 -0500 Subject: [PATCH 6/8] fix(progress)!: Dont allow changing to indeterminate --- crates/anstyle-progress/src/progress.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/anstyle-progress/src/progress.rs b/crates/anstyle-progress/src/progress.rs index c77b1ac..68dd5ab 100644 --- a/crates/anstyle-progress/src/progress.rs +++ b/crates/anstyle-progress/src/progress.rs @@ -7,13 +7,13 @@ /// # use anstyle_progress::TermProgressStatus; /// let mut progress = anstyle_progress::TermProgress::start(); /// -/// let progress = progress.percent(Some(0)); +/// let progress = progress.percent(0); /// println!("{progress}"); /// -/// let progress = progress.percent(Some(50)); +/// let progress = progress.percent(50); /// println!("{progress}"); /// -/// let progress = progress.percent(Some(100)); +/// let progress = progress.percent(100); /// println!("{progress}"); /// /// let progress = progress.remove(); @@ -59,12 +59,12 @@ impl TermProgress { self } - /// Between `0..=100` + /// Set progress percentage (between `0..=100`) /// - /// When `None`, will report an indeterminate status - pub fn percent(mut self, percent: Option) -> Self { - assert!(matches!(percent, Some(0..=100) | None)); - self.percent = percent; + /// Without setting this, progress will be indeterminate + pub fn percent(mut self, percent: u8) -> Self { + assert!(matches!(percent, 0..=100)); + self.percent = Some(percent); self } } From b09800b028d0b3871f2e72f87117c2a55fcf73da Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 16 Mar 2026 12:12:00 -0500 Subject: [PATCH 7/8] fix(progress)!: Switch Remove to a starting state --- crates/anstyle-progress/src/progress.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/crates/anstyle-progress/src/progress.rs b/crates/anstyle-progress/src/progress.rs index 68dd5ab..fecd7ec 100644 --- a/crates/anstyle-progress/src/progress.rs +++ b/crates/anstyle-progress/src/progress.rs @@ -5,7 +5,7 @@ /// ```rust /// # use anstyle_progress::TermProgress; /// # use anstyle_progress::TermProgressStatus; -/// let mut progress = anstyle_progress::TermProgress::start(); +/// let mut progress = TermProgress::start(); /// /// let progress = progress.percent(0); /// println!("{progress}"); @@ -16,7 +16,7 @@ /// let progress = progress.percent(100); /// println!("{progress}"); /// -/// let progress = progress.remove(); +/// let progress = TermProgress::remove(); /// println!("{progress}"); /// ``` #[derive(Copy, Clone)] @@ -47,10 +47,8 @@ impl TermProgress { } /// Remove the indicator - pub fn remove(mut self) -> Self { - self.status = Some(TermProgressStatus::Removed); - self.percent = None; - self + pub fn remove() -> Self { + Self::none().status(TermProgressStatus::Removed) } /// Change the reported status From 504ef62964897ea0574177790cf11dc23507a27d Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 16 Mar 2026 12:13:17 -0500 Subject: [PATCH 8/8] docs(progress): De-emphasis status --- crates/anstyle-progress/src/progress.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/anstyle-progress/src/progress.rs b/crates/anstyle-progress/src/progress.rs index fecd7ec..22dd067 100644 --- a/crates/anstyle-progress/src/progress.rs +++ b/crates/anstyle-progress/src/progress.rs @@ -51,12 +51,6 @@ impl TermProgress { Self::none().status(TermProgressStatus::Removed) } - /// Change the reported status - pub fn status(mut self, status: TermProgressStatus) -> Self { - self.status = Some(status); - self - } - /// Set progress percentage (between `0..=100`) /// /// Without setting this, progress will be indeterminate @@ -65,6 +59,12 @@ impl TermProgress { self.percent = Some(percent); self } + + /// Change the reported status + pub fn status(mut self, status: TermProgressStatus) -> Self { + self.status = Some(status); + self + } } impl Default for TermProgress {