kxio 3.2.0

Provides injectable Filesystem and Network resources to make code more testable
Documentation
//
use std::{
    fs::{DirEntry, ReadDir},
    path::PathBuf,
};

use super::Error;

/// Represents an item in a directory
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum DirItem {
    File(PathBuf),
    Dir(PathBuf),
    SymLink(PathBuf),
    Fifo(PathBuf),
    Unsupported(PathBuf),
}

/// An iterator for items in a directory.
#[derive(Debug, derive_more::Constructor)]
pub struct DirItemIterator(ReadDir);
impl Iterator for DirItemIterator {
    type Item = super::Result<DirItem>;

    fn next(&mut self) -> Option<Self::Item> {
        self.0.next().map(map_dir_item)
    }
}

fn map_dir_item(item: std::io::Result<DirEntry>) -> super::Result<DirItem> {
    tracing::trace!("map_dir_item");
    let item = item.map_err(Error::Io)?;
    tracing::trace!(?item, "map_dir_item");
    let file_type = item.file_type().map_err(Error::Io)?;
    tracing::trace!(?file_type, "map_dir_item");
    if file_type.is_dir() {
        Ok(DirItem::Dir(item.path()))
    } else if file_type.is_file() {
        Ok(DirItem::File(item.path()))
    } else if file_type.is_symlink() {
        Ok(DirItem::SymLink(item.path()))
    } else {
        Ok(DirItem::Unsupported(item.path()))
    }
}