use anyhow::Result;
use std::{fs, path::PathBuf};
use crate::utils::FileItem;
pub struct FilesystemService;
impl FilesystemService {
pub fn load_directory(current_dir: &PathBuf) -> Result<Vec<FileItem>> {
let mut files = Vec::new();
if Self::should_show_drives(current_dir) {
return Self::load_drives();
}
let entries = fs::read_dir(current_dir)?;
let mut items: Vec<FileItem> = entries
.filter_map(|entry| {
let entry = entry.ok()?;
let path = entry.path();
let name = entry.file_name().to_string_lossy().to_string();
let is_dir = path.is_dir();
Some(FileItem { name, path, is_dir })
})
.collect();
items.sort_by(|a, b| match (a.is_dir, b.is_dir) {
(true, false) => std::cmp::Ordering::Less,
(false, true) => std::cmp::Ordering::Greater,
_ => a.name.cmp(&b.name),
});
files.extend(items);
Ok(files)
}
fn should_show_drives(current_dir: &PathBuf) -> bool {
#[cfg(windows)]
{
current_dir.to_string_lossy() == "DRIVES:"
}
#[cfg(not(windows))]
{
let _ = current_dir; false
}
}
pub fn load_drives() -> Result<Vec<FileItem>> {
#[cfg(windows)]
{
let mut drives = Vec::new();
for letter in 'A'..='Z' {
let drive_path = format!("{}:\\", letter);
let path = PathBuf::from(&drive_path);
if path.exists() && path.is_dir() {
drives.push(FileItem {
name: drive_path.clone(),
path,
is_dir: true,
});
}
}
Ok(drives)
}
#[cfg(not(windows))]
{
Ok(Vec::new())
}
}
}