search 1.1.0

A recursive search tool to locate files or find certain strings in files
use jwalk::Parallelism;
use std::fs::read_to_string;

use crate::model::config::SearchType;
use crate::model::config::SearchType::{FindString, LocateFile};
use crate::model::final_result::FinalResult;
use crate::model::search_result::SearchResult;
use crate::util::content_search;

pub fn search(dirs: Vec<String>, query: &str, search_type: SearchType, sensitive: bool) -> FinalResult {
    let mut result = FinalResult::default();
    result.search_type = search_type.clone();

    for dir in dirs {
        jwalk::WalkDir::new(dir)
            .parallelism(Parallelism::RayonNewPool(0))
            .into_iter()
            .filter_map(|e| {
                let dir_entry = e.ok()?;

                if !dir_entry.file_type().is_file() {
                    return None;
                }

                result.file_count += 1;

                let mut file_name = dir_entry.file_name().to_os_string();
                if !sensitive {
                    let _ = query.to_lowercase().as_str();
                    file_name = file_name.to_ascii_lowercase().to_os_string();
                }

                if search_type == LocateFile && file_name == query {
                    result.results.push(SearchResult {
                        filename: dir_entry.path().display().to_string(),
                        ..SearchResult::default()
                    });
                }

                if search_type == FindString {
                    match read_to_string(dir_entry.path()) {
                        Ok(content) => {
                            let mut content_result = content_search::search(query, &*content, sensitive);

                            if !content_result.content.is_empty() {
                                content_result.filename = dir_entry.path().display().to_string();
                                result.results.push(content_result);
                            }
                        }
                        Err(_) => {}
                    };
                }

                return Some(true);
            }).count();
    }

    result
}