use std::fs::{File, OpenOptions};
use std::io::{self, Read, Seek, SeekFrom};
use std::str::FromStr;
use std::sync::{Mutex, MutexGuard};
#[derive(Debug)]
pub struct FileHandle {
handle: Mutex<File>,
}
impl FileHandle {
pub fn new(path: &str, write: bool) -> io::Result<Self> {
let file = OpenOptions::new().read(true).write(write).open(path)?;
Ok(Self { handle: Mutex::new(file) })
}
pub fn read<T: FromStr>(&self) -> T where T::Err: std::fmt::Debug {
let mut file = self.open(0);
let mut buf = String::new();
file.read_to_string(&mut buf).unwrap();
let buf = buf.trim();
buf.parse::<T>().expect(&format!("Could not parse {}", buf))
}
fn open(&self, offset: u64) -> MutexGuard<'_, File> {
let mut file = self.handle.lock().unwrap();
file.seek(SeekFrom::Start(offset)).unwrap();
file
}
}