use crate::CrackTarget;
use std::fmt::{Debug, Formatter};
#[derive(Debug)]
pub enum TargetHashInput<'a> {
HashAsStr(&'a str),
Plaintext(&'a str),
}
pub struct TargetHashAndHashFunction<T: CrackTarget> {
target_hash: T,
hash_fn: fn(input: &str) -> T,
hash_str_repr_to_hash_type_fn: fn(hash_as_string: &str) -> T,
hash_type_to_str_repr_fn: fn(hash: &T) -> String,
}
impl<T: CrackTarget> TargetHashAndHashFunction<T> {
pub fn new(
target_hash: TargetHashInput,
hash_fn: fn(&str) -> T,
hash_str_repr_to_hash_type_fn: fn(hash_as_string: &str) -> T,
hash_type_to_str_repr_fn: fn(hash: &T) -> String,
) -> Self {
let target_hash = match target_hash {
TargetHashInput::HashAsStr(hash_str) => hash_str_repr_to_hash_type_fn(hash_str),
TargetHashInput::Plaintext(input) => hash_fn(input),
};
Self {
target_hash,
hash_fn,
hash_str_repr_to_hash_type_fn,
hash_type_to_str_repr_fn,
}
}
}
impl<T: CrackTarget> Debug for TargetHashAndHashFunction<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.debug_struct("TargetHashAndHashFunction")
.field("target_hash", &self.target_hash)
.field("hash_fn", &"<func impl>")
.field("target_str_repr_to_hash_type_fn", &"<func impl>")
.field("hash_type_to_str_repr_fn", &"<func impl>")
.finish()
}
}
impl<T: CrackTarget> TargetHashAndHashFunction<T> {
pub fn hash_str_repr_to_hash_type(&self, hash_as_string: &str) -> T {
(self.hash_str_repr_to_hash_type_fn)(hash_as_string)
}
pub fn hash(&self, input: &str) -> T {
(self.hash_fn)(input)
}
pub fn target_hash(&self) -> &T {
&self.target_hash
}
pub fn hash_type_to_str_repr(&self, hash: &T) -> String {
(self.hash_type_to_str_repr_fn)(hash)
}
pub fn hash_matches(&self, input: &str) -> bool {
(self.hash_fn)(input) == self.target_hash
}
}