irox_progress/
write.rs

1// SPDX-License-Identifier: MIT
2// Copyright 2025 IROX Contributors
3//
4
5use crate::Task;
6use irox_bits::{Error, MutBits};
7use std::io::Write;
8
9///
10/// A Writer Task accepts a Writer and a task and updates the task with the count of bytes written.
11pub struct WriterTask<T: Write> {
12    writer: T,
13    task: Task,
14}
15
16impl<T: Write> WriterTask<T> {
17    /// Creates a new Writer Task
18    #[must_use]
19    pub fn new(writer: T, task: Task) -> Self {
20        WriterTask { writer, task }
21    }
22}
23
24impl<T: Write> Drop for WriterTask<T> {
25    fn drop(&mut self) {
26        self.task.mark_all_completed();
27    }
28}
29
30impl<T: Write> Write for WriterTask<T> {
31    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
32        let wrote = self.writer.write(buf)?;
33        self.task.mark_some_completed(wrote as u64);
34        Ok(wrote)
35    }
36
37    fn flush(&mut self) -> std::io::Result<()> {
38        self.writer.flush()
39    }
40}
41
42impl<T: Write> MutBits for WriterTask<T> {
43    fn write_u8(&mut self, val: u8) -> Result<(), Error> {
44        self.task.mark_some_completed(1);
45        Ok(self.writer.write_all(&[val])?)
46    }
47
48    fn write_all_bytes(&mut self, val: &[u8]) -> Result<(), Error> {
49        self.task.mark_some_completed(val.len() as u64);
50        Ok(self.writer.write_all(val)?)
51    }
52}