shrupl/src/sharry/file/uploading.rs

89 lines
2 KiB
Rust
Raw Normal View History

use std::{
2025-06-08 00:40:29 +00:00
fmt, fs,
io::{self, Read, Seek, SeekFrom},
path::PathBuf,
};
use serde::{Deserialize, Serialize};
use super::{FileChecked, SharryFile};
#[derive(Serialize, Deserialize, Debug)]
pub struct FileUploading {
2025-06-04 16:58:18 +00:00
path: PathBuf,
2025-06-06 23:42:18 +00:00
size: u64,
patch_uri: String,
2025-06-06 23:42:18 +00:00
offset: u64,
}
2025-06-08 00:40:29 +00:00
impl fmt::Display for FileUploading {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2025-06-05 01:13:54 +00:00
write!(
f,
"Uploading {:?} ({}/{})",
2025-06-05 01:45:25 +00:00
self.path.display(),
self.offset,
self.size
2025-06-05 01:13:54 +00:00
)
}
}
impl FileUploading {
pub fn new(file: FileChecked, patch_uri: String) -> Self {
2025-06-04 16:58:18 +00:00
Self {
path: file.path,
size: file.size,
patch_uri,
2025-06-04 16:58:18 +00:00
offset: 0,
}
}
pub fn get_patch_uri(&self) -> &str {
&self.patch_uri
}
2025-06-06 23:42:18 +00:00
pub fn get_offset(&self) -> u64 {
self.offset
}
pub fn read(&mut self, buf: &mut [u8]) -> io::Result<u64> {
2025-06-05 22:08:24 +00:00
let mut f = fs::File::open(&self.path)?;
f.seek(SeekFrom::Start(self.offset))?;
let read_len = f.read(buf)?;
// convert into `u64`
2025-06-06 23:42:18 +00:00
//
// BOOKMARK this might **panic** on platforms where `usize` has more than 64 bit.
// Also, you're reading more than 2 EiB ... in ONE chunk.
// Whoa! Maybe just chill?
let read_len = u64::try_from(read_len)
.unwrap_or_else(|e| panic!("usize={} did not fit into u64: {}", read_len, e));
2025-06-06 23:42:18 +00:00
self.offset += read_len;
Ok(read_len)
}
pub fn check_eof(self) -> Result<Self, PathBuf> {
if self.offset < self.size {
Ok(self)
} else {
Err(self.path)
}
}
}
2025-06-06 15:21:49 +00:00
impl<'t> SharryFile<'t> for FileUploading {
/// get a reference to the file's name
///
/// Uses `SharryFile::extract_file_name`, which may **panic**!
2025-06-06 23:42:18 +00:00
fn get_name(&'t self) -> &'t str {
2025-06-06 15:21:49 +00:00
<Self as SharryFile>::extract_file_name(&self.path)
}
2025-06-06 23:42:18 +00:00
fn get_size(&self) -> u64 {
self.size
2025-06-06 15:21:49 +00:00
}
}