use crate::frequency_lists::DictionaryType;
use crate::matching::Match;
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "ser", derive(Serialize))]
#[cfg_attr(feature = "ser", serde(tag = "pattern"))]
#[cfg_attr(feature = "ser", serde(rename_all = "lowercase"))]
pub enum MatchPattern {
Dictionary(DictionaryPattern),
Spatial(SpatialPattern),
Repeat(RepeatPattern),
Sequence(SequencePattern),
Regex(RegexPattern),
Date(DatePattern),
BruteForce,
}
impl MatchPattern {
#[cfg(test)]
pub(crate) fn variant(&self) -> &str {
match *self {
MatchPattern::Dictionary(_) => "dictionary",
MatchPattern::Spatial(_) => "spatial",
MatchPattern::Repeat(_) => "repeat",
MatchPattern::Sequence(_) => "sequence",
MatchPattern::Regex(_) => "regex",
MatchPattern::Date(_) => "date",
MatchPattern::BruteForce => "bruteforce",
}
}
}
impl Default for MatchPattern {
fn default() -> Self {
MatchPattern::BruteForce
}
}
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "builder", derive(Builder))]
#[cfg_attr(feature = "builder", builder(default))]
#[cfg_attr(feature = "ser", derive(Serialize))]
pub struct DictionaryPattern {
pub matched_word: String,
pub rank: usize,
pub dictionary_name: DictionaryType,
pub reversed: bool,
pub l33t: bool,
pub sub: Option<HashMap<char, char>>,
pub sub_display: Option<String>,
pub uppercase_variations: u64,
pub l33t_variations: u64,
pub base_guesses: u64,
}
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "builder", derive(Builder))]
#[cfg_attr(feature = "builder", builder(default))]
#[cfg_attr(feature = "ser", derive(Serialize))]
pub struct SpatialPattern {
pub graph: String,
pub turns: usize,
pub shifted_count: usize,
}
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "builder", derive(Builder))]
#[cfg_attr(feature = "builder", builder(default))]
#[cfg_attr(feature = "ser", derive(Serialize))]
pub struct RepeatPattern {
pub base_token: String,
pub base_matches: Vec<Match>,
pub base_guesses: u64,
pub repeat_count: usize,
}
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "builder", derive(Builder))]
#[cfg_attr(feature = "builder", builder(default))]
#[cfg_attr(feature = "ser", derive(Serialize))]
pub struct SequencePattern {
pub sequence_name: &'static str,
pub sequence_space: u8,
pub ascending: bool,
}
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "builder", derive(Builder))]
#[cfg_attr(feature = "builder", builder(default))]
#[cfg_attr(feature = "ser", derive(Serialize))]
pub struct RegexPattern {
pub regex_name: &'static str,
pub regex_match: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "builder", derive(Builder))]
#[cfg_attr(feature = "builder", builder(default))]
#[cfg_attr(feature = "ser", derive(Serialize))]
pub struct DatePattern {
pub separator: String,
pub year: i32,
pub month: i8,
pub day: i8,
}