swdir 0.9.0

Swiftly traverse and scan directories recursively. Sway 🪭, swing 🎷 or swim 🪼 in directories.
Documentation
/// ```rust
/// use swdir::Swdir;
///
/// let dir_node = Swdir::default().set_root_path("/some/path").walk(); // -> DirNode
/// ```
use std::path::PathBuf;

mod scan;

use crate::helpers::dir_node::DirNode;
use crate::helpers::error::SwdirError;
use crate::helpers::recurse::Recurse;
use crate::helpers::validate::validate_list_extensions;

const MAX_THREADS: usize = 8;

#[derive(Clone)]
/// core module
pub struct Swdir {
    root_path: PathBuf,
    recurse: Recurse,
    include_hidden: bool,
    extension_allowlist: Option<Vec<String>>,
    extension_denylist: Option<Vec<String>>,
    max_threads: usize,
}

impl Swdir {
    /// set root path
    pub fn set_root_path<T: Into<PathBuf>>(&mut self, path: T) -> Self {
        self.root_path = path.into();
        self.to_owned()
    }

    /// set recurse option
    pub fn set_recurse(&mut self, recurse: Recurse) -> Self {
        self.recurse = recurse;
        self.to_owned()
    }

    /// disable option to skip hidden files / directories
    pub fn include_hidden(&mut self) -> Self {
        self.include_hidden = true;
        self.to_owned()
    }

    /// set extension allowlist
    pub fn set_extension_allowlist<T: Into<String> + Clone>(
        &mut self,
        list: &[T],
    ) -> Result<Self, SwdirError> {
        let list: Vec<String> = list.to_vec().into_iter().map(|x| x.into()).collect();
        validate_list_extensions(&list, self.extension_denylist.as_ref())?;
        self.extension_allowlist = Some(list);
        Ok(self.to_owned())
    }

    /// set extension denylist
    pub fn set_extension_denylist<T: Into<String> + Clone>(
        &mut self,
        list: &[T],
    ) -> Result<Self, SwdirError> {
        let list: Vec<String> = list.to_vec().into_iter().map(|x| x.into()).collect();
        validate_list_extensions(&list, self.extension_allowlist.as_ref())?;
        self.extension_denylist = Some(list);
        Ok(self.to_owned())
    }

    /// walk directory
    pub fn walk(&self) -> DirNode {
        self.walk_parallel()
    }
}

impl Swdir {
    pub fn default() -> Self {
        Self {
            root_path: PathBuf::from("."),
            max_threads: MAX_THREADS,
            recurse: Recurse::default(),
            include_hidden: false,
            extension_allowlist: None,
            extension_denylist: None,
        }
    }
}