1use crate::Task;
6use irox_bits::{Error, MutBits};
7use std::io::Write;
8
9pub struct WriterTask<T: Write> {
12 writer: T,
13 task: Task,
14}
15
16impl<T: Write> WriterTask<T> {
17 #[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}