use crate::checksums::CheckSums;
use crate::download::get_filename_destination;
use crate::image_history::DbImageHistory;
use crate::website::Url;
use chrono::NaiveDateTime;
use colored::Colorize;
use log::{error, info, warn};
use std::fmt;
use std::path::Path;
#[derive(Default, PartialEq, Debug)]
pub struct CloudImage {
pub url: Url,
pub name: String,
pub checksum: CheckSums,
pub date: NaiveDateTime,
}
impl CloudImage {
#[must_use]
pub fn new(url: Url, checksum: CheckSums, name: String, date: NaiveDateTime) -> Self {
CloudImage {
url,
name,
checksum,
date,
}
}
#[must_use]
pub fn verify(&self, destination: &Path, normalize: &Option<String>) -> bool {
if let Some(filename) = get_filename_destination(self, destination, normalize) {
match self.checksum.verify_file(&filename) {
Ok(no_error) => match no_error {
Some(success) => {
if success {
info!("{} Successfully verified {filename}", "🗸".green());
return true;
}
warn!("{} Verifying failed for {filename}", "𐄂".red());
return false;
}
None => {
warn!("{} {filename} not verified.", "𐄂".red());
return true;
}
},
Err(e) => {
error!("Error verifying {filename}: {e}");
return false;
}
}
}
false
}
pub fn is_in_db(&self, db: &DbImageHistory) -> bool {
db.is_image_in_db(Some(self)).unwrap_or_default()
}
}
impl fmt::Display for CloudImage {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match &self.checksum {
CheckSums::None => writeln!(f, "\t-> {}", self.url.url),
CheckSums::Sha256(checksum) | CheckSums::Sha512(checksum) => {
writeln!(f, "\t-> {} with checksum {}", self.url.url, checksum)
}
}
}
}