From 4370d41e71a38e29decf551d1a72f896af7bdc2b Mon Sep 17 00:00:00 2001 From: Matt Green Date: Thu, 27 Oct 2016 08:27:16 -0400 Subject: [PATCH] Make NotificationFilter immutable --- src/main.rs | 10 +----- src/notification_filter.rs | 64 ++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 42 deletions(-) diff --git a/src/main.rs b/src/main.rs index e5c8795..99e216b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -91,17 +91,9 @@ fn main() { } } - let mut filter = NotificationFilter::new(&cwd, gitignore_file) + let filter = NotificationFilter::new(&cwd, args.filters, args.ignores, gitignore_file) .expect("unable to create notification filter"); - for f in args.filters { - filter.add_filter(&f).expect("bad filter"); - } - - for i in args.ignores { - filter.add_ignore(&i).expect("bad ignore pattern"); - } - let (tx, rx) = channel(); let mut watcher = Watcher::new(tx, args.poll, args.poll_interval) .expect("unable to create watcher"); diff --git a/src/notification_filter.rs b/src/notification_filter.rs index de4eb12..0e62ad1 100644 --- a/src/notification_filter.rs +++ b/src/notification_filter.rs @@ -7,54 +7,52 @@ use std::path::{Path, PathBuf}; use self::glob::{Pattern, PatternError}; pub struct NotificationFilter { - cwd: PathBuf, filters: Vec, ignores: Vec, ignore_file: Option, } #[derive(Debug)] -pub enum NotificationError { +pub enum Error { BadPattern(PatternError), Io(io::Error), } impl NotificationFilter { pub fn new(current_dir: &Path, + filters: Vec, + ignores: Vec, ignore_file: Option) - -> Result { - let canonicalized = try!(current_dir.canonicalize()); + -> Result { + let cwd = try!(current_dir.canonicalize()); + + let compiled_filters = try!(filters.iter() + .map(|p| NotificationFilter::pattern_for(&cwd, p)) + .collect()); + + for compiled_filter in &compiled_filters { + debug!("Adding filter: {}", compiled_filter); + } + + let compiled_ignores = try!(ignores.iter() + .map(|p| NotificationFilter::pattern_for(&cwd, p)) + .collect()); + + for compiled_ignore in &compiled_ignores { + debug!("Adding ignore: {}", compiled_ignore); + } Ok(NotificationFilter { - cwd: canonicalized, - filters: vec![], - ignores: vec![], + filters: compiled_filters, + ignores: compiled_ignores, ignore_file: ignore_file, }) } - pub fn add_filter(&mut self, pattern: &str) -> Result<(), NotificationError> { - let compiled = try!(self.pattern_for(pattern)); - self.filters.push(compiled); - - debug!("Adding filter: {}", pattern); - - Ok(()) - } - - pub fn add_ignore(&mut self, pattern: &str) -> Result<(), NotificationError> { - let compiled = try!(self.pattern_for(pattern)); - self.ignores.push(compiled); - - debug!("Adding ignore: {}", pattern); - - Ok(()) - } - - fn pattern_for(&self, p: &str) -> Result { + fn pattern_for(cwd: &PathBuf, p: &str) -> Result { let mut path = PathBuf::from(p); if path.is_relative() { - path = self.cwd.join(path.as_path()); + path = cwd.join(path.as_path()); } if let Ok(metadata) = path.metadata() { @@ -97,14 +95,14 @@ impl NotificationFilter { } } -impl From for NotificationError { - fn from(err: io::Error) -> NotificationError { - NotificationError::Io(err) +impl From for Error { + fn from(err: io::Error) -> Error { + Error::Io(err) } } -impl From for NotificationError { - fn from(err: PatternError) -> NotificationError { - NotificationError::BadPattern(err) +impl From for Error { + fn from(err: PatternError) -> Error { + Error::BadPattern(err) } }