use std::ffi::OsStr;
use std::fs::File;
use std::io::{self, Read};
use std::path::Path;
pub fn read_to_string_buffer(buffer: &mut String, path: &Path) -> io::Result<usize> {
let mut file = File::open(path)?;
buffer.clear();
file.read_to_string(buffer)
}
pub fn read_to_bytes_buffer(buffer: &mut Vec<u8>, path: &Path) -> io::Result<usize> {
let mut file = File::open(path)?;
buffer.clear();
file.read(buffer)
}
pub fn file_prefix(path: &Path) -> Option<&OsStr> {
fn split_file_at_dot(file: &OsStr) -> (&OsStr, Option<&OsStr>) {
let slice = file.as_encoded_bytes();
if slice == b".." {
return (file, None);
}
let i = match slice[1..].iter().position(|b| *b == b'.') {
Some(i) => i + 1,
None => return (file, None),
};
let before = &slice[..i];
let after = &slice[i + 1..];
unsafe {
(
OsStr::from_encoded_bytes_unchecked(before),
Some(OsStr::from_encoded_bytes_unchecked(after)),
)
}
}
path.file_name()
.map(split_file_at_dot)
.map(|(before, _after)| before)
}