use crate::store::nsignore::{get_nsignore_file, get_nsignore_rules, is_file_ignored}; use std::path::PathBuf; use std::sync::OnceLock; pub struct Ignorer { /// Path of this level path: PathBuf, /// Should it use the nextsyncignore file use_nsignore: bool, /// Nsignore's rules rules: OnceLock>, childs: Option>>, } impl Ignorer { pub fn new(path: &PathBuf) -> Self { Ignorer { path: path.to_path_buf(), use_nsignore: true, rules: OnceLock::new(), childs: None, } } pub fn active_nsignore(&mut self, active: bool) { self.use_nsignore = active; } fn get_rules(&mut self) -> &Vec { self.rules .get_or_init(|| match get_nsignore_file(&self.path) { Some(nsignore_path) => get_nsignore_rules(&nsignore_path), None => Vec::new(), }) } fn is_config_file(&self, path: &PathBuf) -> bool { path.ends_with(".nextsync") } /// Returns whether a file/dir is ignored or not /// /// * `path`: fn is_ignored(&mut self, path: &PathBuf) -> bool { is_file_ignored(path.to_str().unwrap(), self.get_rules()) } /// Returns whether a file/dir should be ignored by the program or not /// /// This takes advantage of the `use_nsignore` variable set by /// `active_nsignore`. /// /// * `path`: pub fn should_ignore(&mut self, path: &PathBuf) -> bool { self.is_config_file(path) || (self.use_nsignore && self.is_ignored(path)) } }