cosmic-files/src/operation/reader.rs

41 lines
993 B
Rust
Raw Normal View History

use std::{fs, io, path::Path};
2024-11-15 09:47:03 -07:00
use super::Controller;
// Special reader just for operations, handling cancel and progress
pub struct OpReader {
file: fs::File,
metadata: fs::Metadata,
current: u64,
2024-11-15 09:47:03 -07:00
controller: Controller,
}
impl OpReader {
pub fn new<P: AsRef<Path>>(path: P, controller: Controller) -> io::Result<Self> {
let file = fs::File::open(&path)?;
let metadata = file.metadata()?;
Ok(Self {
file,
metadata,
current: 0,
2024-11-15 09:47:03 -07:00
controller,
})
}
}
impl io::Read for OpReader {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
2024-11-15 09:47:03 -07:00
self.controller
.check()
.map_err(|err| io::Error::new(io::ErrorKind::Other, err))?;
let count = self.file.read(buf)?;
self.current += count as u64;
let progress = self.current as f32 / self.metadata.len() as f32;
self.controller.set_progress(progress);
Ok(count)
}
}