use crate::{Error, Result};
use simple_fs::{SFile, SPath};
use std::env;
use std::fs::File;
use std::io::{BufReader, Read};
use std::path::Path;
pub fn first_file_from_dirs(dirs: &[&str], path: &str) -> Result<Option<SFile>> {
for dir in dirs {
let file_path = Path::new(dir).join(path);
if file_path.exists() {
return Ok(Some(SFile::from_path(file_path)?));
}
}
Ok(None)
}
pub fn current_dir() -> Result<SPath> {
let dir = env::current_dir().map_err(|err| Error::cc("Current dir error", err))?;
let dir = SPath::new(dir)?;
Ok(dir)
}
pub fn is_file_empty(file_path: impl AsRef<Path>) -> Result<bool> {
let path = file_path.as_ref();
let file = File::open(path).map_err(|err| {
Error::cc(
"Cannot determine if file empty",
format!("File '{}' open error. Cause: {err}", path.to_string_lossy()),
)
})?;
let mut reader = BufReader::new(file);
let mut small_buffer = [0; 64];
let num_bytes = reader.read(&mut small_buffer)?;
if num_bytes == 0 {
return Ok(true);
}
if !is_buff_empty(&small_buffer[..num_bytes]) {
return Ok(false);
}
if num_bytes < small_buffer.len() {
return Ok(true);
}
let mut large_buffer = [0; 1024];
loop {
let num_bytes = reader.read(&mut large_buffer)?;
if num_bytes == 0 {
break;
}
if !is_buff_empty(&large_buffer[..num_bytes]) {
return Ok(false);
}
}
Ok(true)
}
fn is_buff_empty(buff: &[u8]) -> bool {
let s = std::str::from_utf8(buff).unwrap_or("");
s.chars().all(|c| c.is_whitespace())
}