aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/filters.rs33
-rw-r--r--src/main.rs36
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)
}
}