findit-rs 0.1.0

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

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

pub fn traverse_files(start_path: &str) -> Vec<String> {
    let mut files: Vec<String> = 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();
            let path_str = path.to_string_lossy();
            if should_ignore(&path_str) {
                logger::info(&format!("Ignoring '{}'", path_str));
                continue;
            }
            if path.is_dir() {
                logger::info(&format!("Dir '{}', opening", path_str));
                files.extend(traverse_files(&path_str));
            } else {
                logger::info(&format!("File '{}', adding", path_str));
                files.push(path_str.into_owned());
            }
        }
    }
    files
}

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

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