findit-rs 0.2.0

A fast, lightweight command-line filesystem search tool
use crate::utils::{file, logger};
use std::path::{Path, PathBuf};

fn should_ignore(path: &Path) -> bool {
    if let Ok(contents) = crate::utils::file::read_ignore_file() {
        for line in contents.iter() {
            if !line.is_empty() && path.to_string_lossy().contains(line.as_str()) {
                return true;
            }
        }
    }
    false
}

pub fn traverse_files(start_path: &Path) -> Vec<PathBuf> {
    let mut files: Vec<PathBuf> = Vec::new();
    if should_ignore(start_path) {
        return files;
    }
    if let Ok(entries) = std::fs::read_dir(start_path) {
        for entry in entries.flatten() {
            let path = entry.path();
            if should_ignore(&path) {
                logger::info(&format!("Ignoring '{}'", path.display()));
                continue;
            }
            if path.is_dir() {
                logger::info(&format!("Dir '{}', opening", path.display()));
                files.extend(traverse_files(&path));
            } else {
                logger::info(&format!("File '{}', adding", path.display()));
                files.push(path);
            }
        }
    }
    files
}

pub fn traverse_dirs(start_path: &Path) -> Vec<PathBuf> {
    let mut dirs: Vec<PathBuf> = Vec::new();
    if let Ok(entries) = std::fs::read_dir(start_path) {
        for entry in entries.flatten() {
            let path = entry.path();
            if should_ignore(&path) {
                logger::info(&format!("Ignoring '{}'", path.display()));
                continue;
            }
            if path.is_dir() {
                logger::info(&format!("Dir '{}', adding", path.display()));
                dirs.extend(traverse_dirs(&path));
                dirs.push(path);
            }
        }
    }
    dirs
}

pub fn traverse_words(file_path: &Path) -> Vec<String> {
    file::read_file(&file_path)
}