use crate::ratchets::entropy_bank::DRILL_RANGE;
use rand::prelude::SliceRandom;
use rand::thread_rng;
use std::fmt::{Display, Formatter};
#[derive(Clone)]
pub enum CryptError<T = String> {
Encrypt(T),
Decrypt(T),
RekeyUpdateError(T),
OutOfBoundsError,
BadSecuritySetting,
FatalError(String),
}
impl<T> CryptError<T> {
pub fn into_string(self) -> String
where
T: Into<String>,
{
match self {
CryptError::Encrypt(s) => s.into(),
CryptError::Decrypt(s) => s.into(),
CryptError::RekeyUpdateError(s) => s.into(),
CryptError::OutOfBoundsError => "[CryptError] Out of bounds exception".to_string(),
CryptError::BadSecuritySetting => "[CryptError] Bad security setting".to_string(),
CryptError::FatalError(s) => s,
}
}
pub fn as_str(&self) -> &str
where
T: AsRef<str>,
{
match self {
CryptError::Encrypt(s) => s.as_ref(),
CryptError::Decrypt(s) => s.as_ref(),
CryptError::RekeyUpdateError(s) => s.as_ref(),
CryptError::OutOfBoundsError => "[CryptError] Out of bounds exception",
CryptError::BadSecuritySetting => "[CryptError] Bad security setting",
CryptError::FatalError(s) => s.as_ref(),
}
}
}
impl<T: AsRef<str>> std::fmt::Debug for CryptError<T> {
fn fmt(&self, f: &mut Formatter) -> Result<(), std::fmt::Error> {
write!(f, "{}", self.as_str())
}
}
impl<T: AsRef<str>> Display for CryptError<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
std::fmt::Debug::fmt(self, f)
}
}
impl std::error::Error for CryptError {}
pub fn create_port_mapping() -> Vec<(u16, u16)> {
let mut input_ports = Vec::with_capacity(DRILL_RANGE);
let mut output_ports = Vec::with_capacity(DRILL_RANGE);
for i in 0..DRILL_RANGE {
input_ports.push(i);
output_ports.push(i);
}
let mut rng = thread_rng();
input_ports.as_mut_slice().shuffle(&mut rng);
output_ports.as_mut_slice().shuffle(&mut rng);
let mut output_vec = Vec::with_capacity(DRILL_RANGE);
for i in 0..DRILL_RANGE {
output_vec.push((input_ports[i] as u16, output_ports[i] as u16));
}
output_vec
}