use bladvak::eframe::egui;
use bladvak::errors::ErrorManager;
use md5::Md5;
use sha1::{Digest, Sha1};
use sha2::{Sha256, Sha512};
use base16ct::HexDisplay;
#[derive(Debug)]
struct Hashes {
sha1: String,
sha256: String,
sha512: String,
md5: String,
}
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
pub(crate) struct Hashing {
pub(crate) is_open: bool,
#[serde(skip)]
data: Option<Hashes>,
}
impl Hashing {
pub(crate) fn new() -> Self {
Self {
is_open: false,
..Self::default()
}
}
pub(crate) fn reset(&mut self) {
self.data = None;
}
pub(crate) fn window_title() -> &'static str {
"Hashing"
}
fn calculate_hashes(binary_data: &[u8]) -> Hashes {
let sha1 = format!("{:x}", HexDisplay(&Sha1::digest(binary_data)));
let sha256 = format!("{:x}", HexDisplay(&Sha256::digest(binary_data)));
let sha512 = format!("{:x}", HexDisplay(&Sha512::digest(binary_data)));
let md5 = format!("{:x}", HexDisplay(&Md5::digest(binary_data)));
Hashes {
sha1,
sha256,
sha512,
md5,
}
}
pub(crate) fn ui(
&mut self,
binary_data: &[u8],
ui: &mut egui::Ui,
_error_manager: &mut ErrorManager,
) {
if self.is_open {
let mut is_open = self.is_open;
if let Some(data) = &self.data {
egui::Window::new(Self::window_title())
.open(&mut is_open)
.vscroll(true)
.show(ui.ctx(), |ui| {
ui.label("sha1");
ui.label(&data.sha1);
ui.separator();
ui.label("sha256");
ui.label(&data.sha256);
ui.separator();
ui.label("sha512");
ui.label(&data.sha512);
ui.separator();
ui.label("md5");
ui.label(&data.md5);
});
self.is_open = is_open;
} else if binary_data.is_empty() {
egui::Window::new(Self::window_title())
.open(&mut is_open)
.vscroll(true)
.show(ui.ctx(), |ui| {
ui.label("File is empty");
});
self.is_open = is_open;
} else {
self.data = Some(Self::calculate_hashes(binary_data));
}
}
}
}