irox_progress/
read.rs

1// SPDX-License-Identifier: MIT
2// Copyright 2023 IROX Contributors
3//
4
5use crate::Task;
6use std::io::Read;
7
8///
9/// A Reader Task takes a Read, and updates the task with the bytes as they're read.
10pub struct ReaderTask<T: Read> {
11    reader: T,
12    task: Task,
13}
14
15impl<T: Read> ReaderTask<T> {
16    /// Creates a new reader task from the specified reader, and task
17    #[must_use]
18    pub fn new(reader: T, task: Task) -> Self {
19        ReaderTask { reader, task }
20    }
21}
22
23impl<T: Read> Drop for ReaderTask<T> {
24    fn drop(&mut self) {
25        self.task.mark_all_completed();
26    }
27}
28impl<T: Read> Read for ReaderTask<T> {
29    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
30        let read = self.reader.read(buf)?;
31        self.task.mark_some_completed(read as u64);
32        Ok(read)
33    }
34}