diff options
author | Daniel <kingdread@gmx.de> | 2019-05-31 02:51:16 +0200 |
---|---|---|
committer | Daniel <kingdread@gmx.de> | 2019-05-31 02:51:16 +0200 |
commit | c731b470fc162e56f6d81c475bacb41230a5e2d3 (patch) | |
tree | 926a46c99d465b4da362c6583364b11bb6109771 /src | |
parent | 9243e9c6cc6cdefe1565291a2933cc58556ebe9b (diff) | |
download | raidgrep-c731b470fc162e56f6d81c475bacb41230a5e2d3.tar.gz raidgrep-c731b470fc162e56f6d81c475bacb41230a5e2d3.tar.bz2 raidgrep-c731b470fc162e56f6d81c475bacb41230a5e2d3.zip |
add option to filter based on boss
Diffstat (limited to 'src')
-rw-r--r-- | src/csl.rs | 17 | ||||
-rw-r--r-- | src/filters.rs | 11 | ||||
-rw-r--r-- | src/main.rs | 13 |
3 files changed, 39 insertions, 2 deletions
@@ -5,6 +5,7 @@ use std::fmt; use super::{SearchField, FightOutcome}; use chrono::Weekday; +use evtclib::statistics::gamedata::Boss; pub trait Variants: Copy { type Output: Iterator<Item=Self>; @@ -29,12 +30,26 @@ macro_rules! variants { ].iter().cloned() } } - } + }; + ($target:ident => $($var:ident,)+) => { + variants!($target => $($var),+); + }; } variants! { SearchField => Account, Character } variants! { FightOutcome => Success, Wipe } variants! { Weekday => Mon, Tue, Wed, Thu, Fri, Sat, Sun } +variants! { Boss => + ValeGuardian, Gorseval, Sabetha, + Slothasor, Matthias, + KeepConstruct, Xera, + Cairn, MursaatOverseer, Samarog, Deimos, + SoullessHorror, Dhuum, + ConjuredAmalgamate, LargosTwins, Qadim, + + Skorvald, Artsariiv, Arkk, + MAMA, Siax, Ensolyss, +} /// The character that delimits items from each other. const DELIMITER: char = ','; diff --git a/src/filters.rs b/src/filters.rs index 8433690..02334bc 100644 --- a/src/filters.rs +++ b/src/filters.rs @@ -1,5 +1,8 @@ use evtclib::{Agent, AgentName}; use evtclib::raw::parser::PartialEvtc; +use evtclib::statistics::gamedata::Boss; + +use num_traits::FromPrimitive; use super::{SearchField, LogResult, Opt}; @@ -30,6 +33,14 @@ pub fn filter_name(evtc: &PartialEvtc, opt: &Opt) -> bool { false } +/// Do filtering based on the boss ID. +pub fn filter_boss(evtc: &PartialEvtc, opt: &Opt) -> bool { + let boss = Boss::from_u16(evtc.header.combat_id); + boss + .map(|b| opt.bosses.contains(&b)) + .unwrap_or(true) +} + /// Do filtering based on the fight outcome. pub fn filter_outcome(result: &LogResult, opt: &Opt) -> bool { opt.outcome.contains(&result.outcome) diff --git a/src/main.rs b/src/main.rs index 87ebbb0..89dab09 100644 --- a/src/main.rs +++ b/src/main.rs @@ -123,6 +123,14 @@ pub struct Opt { )] weekdays: CommaSeparatedList<Weekday>, + /// Only show logs from the given encounters. + #[structopt( + short = "e", + long = "bosses", + default_value = "*", + )] + bosses: CommaSeparatedList<evtclib::statistics::gamedata::Boss>, + /// Print more debugging information to stderr. #[structopt(long = "debug")] debug: bool, @@ -317,7 +325,10 @@ fn search_log(entry: &DirEntry, opt: &Opt) -> Result<Option<LogResult>, RuntimeE let mut stream = wrapper.get_stream(); let partial = evtclib::raw::parser::parse_partial_file(&mut stream)?; - if filters::filter_name(&partial, opt) == opt.invert { + let early_ok = filters::filter_name(&partial, opt) != opt.invert + && filters::filter_boss(&partial, opt); + + if !early_ok { return Ok(None) } |