diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/filters.rs | 33 | ||||
| -rw-r--r-- | src/main.rs | 36 | 
2 files changed, 42 insertions, 27 deletions
| diff --git a/src/filters.rs b/src/filters.rs new file mode 100644 index 0000000..1549c26 --- /dev/null +++ b/src/filters.rs @@ -0,0 +1,33 @@ +use evtclib::{AgentName, Log}; + +use super::{LogResult, Opt}; + +/// Do filtering based on the character or account name. +pub fn filter_name(log: &Log, opt: &Opt) -> bool { +    for player in log.players() { +        match player.name() { +            AgentName::Player { +                account_name, +                character_name, +                .. +            } => { +                if (opt.field.search_account() && opt.expression.is_match(account_name)) +                    || (opt.field.search_character() && opt.expression.is_match(character_name)) +                { +                    return true; +                } +            } +            _ => unreachable!(), +        } +    } +    return false; +} + +/// Do filtering based on the fight outcome. +pub fn filter_outcome(result: &LogResult, opt: &Opt) -> bool { +    match opt.outcome { +        Some(o) if o == result.outcome => true, +        None => true, +        _ => false, +    } +} diff --git a/src/main.rs b/src/main.rs index 9343e14..2e3007c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,11 +27,13 @@ use errors::RuntimeError;  mod output; +mod filters; +  /// A program that allows you to search through all your evtc logs for specific  /// people.  #[derive(StructOpt, Debug)]  #[structopt(name = "raidgrep")] -struct Opt { +pub struct Opt {      /// Path to the folder with logs.      #[structopt(          short = "d", @@ -207,34 +209,14 @@ fn search_log(entry: &DirEntry, opt: &Opt) -> Result<Option<LogResult>, RuntimeE          return Ok(None);      }; -    let mut candidate_good = false; -    for player in log.players() { -        match player.name() { -            AgentName::Player { -                account_name, -                character_name, -                .. -            } => { -                if (opt.field.search_account() && opt.expression.is_match(account_name)) -                    || (opt.field.search_character() && opt.expression.is_match(character_name)) -                { -                    candidate_good = true; -                } -            } -            _ => unreachable!(), -        } -    } - -    if !candidate_good { -        return Ok(None); -    } +    let info = extract_info(entry, &log); -    let result = extract_info(entry, &log); +    let take_log = filters::filter_name(&log, opt) && filters::filter_outcome(&info, opt); -    match opt.outcome { -        Some(o) if o == result.outcome => Ok(Some(result)), -        None => Ok(Some(result)), -        _ => Ok(None), +    if take_log { +        Ok(Some(info)) +    } else { +        Ok(None)      }  } | 
