use crate::checkers::CheckerTypes;
use super::crack_results::CrackResult;
use super::interface::Crack;
use super::interface::Decoder;
use log::trace;
pub struct ReverseDecoder;
impl Crack for Decoder<ReverseDecoder> {
fn new() -> Decoder<ReverseDecoder> {
Decoder {
name: "Reverse",
description: "Reverses a string. stac -> cats",
link: "http://string-functions.com/reverse.aspx",
tags: vec!["reverse", "decoder", "reciprocal"],
popularity: 0.2,
phantom: std::marker::PhantomData,
}
}
fn crack(&self, text: &str, checker: &CheckerTypes) -> CrackResult {
trace!("Running reverse string");
let mut result = CrackResult::new(self, text.to_string());
if text.is_empty() {
return result;
}
let rev_str: String = text.chars().rev().collect();
let checker_res = checker.check(&rev_str);
result.unencrypted_text = Some(vec![rev_str]);
result.update_checker(&checker_res);
result
}
fn get_tags(&self) -> &Vec<&str> {
&self.tags
}
fn get_name(&self) -> &str {
self.name
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{
checkers::{
athena::Athena,
checker_type::{Check, Checker},
},
decoders::interface::Crack,
};
fn get_athena_checker() -> CheckerTypes {
let athena_checker = Checker::<Athena>::new();
CheckerTypes::CheckAthena(athena_checker)
}
#[test]
fn returns_success() {
let reverse_decoder = Decoder::<ReverseDecoder>::new();
let result = reverse_decoder
.crack("stac", &get_athena_checker())
.unencrypted_text
.expect("No unencrypted string for reverse decoder");
assert_eq!(result[0], "cats");
}
#[test]
fn returns_nothing() {
let reverse_decoder = Decoder::<ReverseDecoder>::new();
let result = reverse_decoder
.crack("", &get_athena_checker())
.unencrypted_text;
assert!(result.is_none());
}
}