summaryrefslogtreecommitdiff
path: root/src/term.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/term.rs')
-rw-r--r--src/term.rs60
1 files changed, 50 insertions, 10 deletions
diff --git a/src/term.rs b/src/term.rs
index 1e08c84..3d149b3 100644
--- a/src/term.rs
+++ b/src/term.rs
@@ -160,6 +160,37 @@ impl<'a, 'lock> CheckProgressVisualizer<'a, 'lock> {
}
}
+pub struct ProgressCounter<'a, 'lock> {
+ stdout: &'a mut StdoutLock<'lock>,
+ total: usize,
+ counter: usize,
+}
+
+impl<'a, 'lock> ProgressCounter<'a, 'lock> {
+ pub fn new(stdout: &'a mut StdoutLock<'lock>, total: usize) -> io::Result<Self> {
+ write!(stdout, "Progress: 0/{total}")?;
+ stdout.flush()?;
+
+ Ok(Self {
+ stdout,
+ total,
+ counter: 0,
+ })
+ }
+
+ pub fn increment(&mut self) -> io::Result<()> {
+ self.counter += 1;
+ write!(self.stdout, "\rProgress: {}/{}", self.counter, self.total)?;
+ self.stdout.flush()
+ }
+}
+
+impl Drop for ProgressCounter<'_, '_> {
+ fn drop(&mut self) {
+ let _ = self.stdout.write_all(b"\n\n");
+ }
+}
+
pub fn progress_bar<'a>(
writer: &mut impl CountedWrite<'a>,
progress: u16,
@@ -241,22 +272,18 @@ pub fn canonicalize(path: &str) -> Option<String> {
})
}
-pub fn terminal_file_link<'a>(
- writer: &mut impl CountedWrite<'a>,
- path: &str,
- canonical_path: &str,
+pub fn file_path<'a, W: CountedWrite<'a>>(
+ writer: &mut W,
color: Color,
+ f: impl FnOnce(&mut W) -> io::Result<()>,
) -> io::Result<()> {
writer
.stdout()
.queue(SetForegroundColor(color))?
.queue(SetAttribute(Attribute::Underlined))?;
- writer.stdout().write_all(b"\x1b]8;;file://")?;
- writer.stdout().write_all(canonical_path.as_bytes())?;
- writer.stdout().write_all(b"\x1b\\")?;
- // Only this part is visible.
- writer.write_str(path)?;
- writer.stdout().write_all(b"\x1b]8;;\x1b\\")?;
+
+ f(writer)?;
+
writer
.stdout()
.queue(SetForegroundColor(Color::Reset))?
@@ -265,6 +292,19 @@ pub fn terminal_file_link<'a>(
Ok(())
}
+pub fn terminal_file_link<'a>(
+ writer: &mut impl CountedWrite<'a>,
+ path: &str,
+ canonical_path: &str,
+) -> io::Result<()> {
+ writer.stdout().write_all(b"\x1b]8;;file://")?;
+ writer.stdout().write_all(canonical_path.as_bytes())?;
+ writer.stdout().write_all(b"\x1b\\")?;
+ // Only this part is visible.
+ writer.write_str(path)?;
+ writer.stdout().write_all(b"\x1b]8;;\x1b\\")
+}
+
pub fn write_ansi(output: &mut Vec<u8>, command: impl Command) {
struct FmtWriter<'a>(&'a mut Vec<u8>);