cargo_auto_local_lib/
file_hashes_mod.rsuse serde_derive::{Deserialize, Serialize};
use sha2::Digest;
#[derive(Serialize, Deserialize)]
pub struct FileMetaData {
filename: String,
filehash: String,
}
#[derive(Serialize, Deserialize)]
pub struct FileHashes {
pub vec_file_metadata: Vec<FileMetaData>,
}
pub fn is_project_changed() -> bool {
let vec_of_metadata = read_file_metadata();
let js_struct = read_json_file(&crate::PATH_FILE_HASHES_JSON.to_string_lossy());
!are_all_files_equal(&vec_of_metadata, &js_struct.vec_file_metadata)
}
fn are_all_files_equal(vec_of_metadata: &[FileMetaData], js_vec_of_metadata: &[FileMetaData]) -> bool {
let mut is_files_equal = true;
for x in vec_of_metadata.iter() {
let mut is_one_equal = false;
for y in js_vec_of_metadata.iter() {
if x.filename == y.filename && x.filehash == y.filehash {
is_one_equal = true;
break;
}
}
if !is_one_equal {
is_files_equal = false;
break;
}
}
is_files_equal
}
pub fn read_file_metadata() -> Vec<FileMetaData> {
let mut vec_of_metadata: Vec<FileMetaData> = Vec::new();
let filehash = sha256_digest(&crate::PATH_CARGO_TOML).unwrap();
vec_of_metadata.push(FileMetaData {
filename: crate::PATH_CARGO_TOML.to_string_lossy().to_string(),
filehash,
});
let filehash = sha256_digest(&crate::PATH_TARGET_DEBUG_AUTOMATION_TASKS_RS).unwrap();
vec_of_metadata.push(FileMetaData {
filename: crate::PATH_TARGET_DEBUG_AUTOMATION_TASKS_RS.to_string_lossy().to_string(),
filehash,
});
for entry in walkdir::WalkDir::new(crate::PATH_SRC.as_path()).into_iter().filter_map(Result::ok) {
if entry.file_type().is_file() {
let path = entry.path();
let filehash = sha256_digest(path).unwrap();
vec_of_metadata.push(FileMetaData {
filename: path.to_string_lossy().to_string(),
filehash,
});
}
}
vec_of_metadata
}
fn read_json_file(json_filepath: &str) -> FileHashes {
let js_struct: FileHashes;
let f = std::fs::read_to_string(json_filepath);
match f {
Ok(x) => {
if x.contains("\r\n") {
js_struct = FileHashes {
vec_file_metadata: Vec::new(),
}
} else {
js_struct = serde_json::from_str(x.as_str()).unwrap();
}
}
Err(_error) => {
js_struct = FileHashes {
vec_file_metadata: Vec::new(),
}
}
};
js_struct
}
fn sha256_digest(path: &std::path::Path) -> anyhow::Result<String> {
let file = std::fs::File::open(path)?;
let mut reader = std::io::BufReader::new(file);
let mut hasher = <sha2::Sha256 as sha2::Digest>::new();
let mut buffer = [0; 1024];
use std::io::Read;
loop {
let count = reader.read(&mut buffer)?;
if count == 0 {
break;
}
hasher.update(&buffer[..count]);
}
let digest = hasher.finalize();
let hash_string = data_encoding::HEXLOWER.encode(digest.as_ref());
Ok(hash_string)
}
pub fn save_json_file_for_file_meta_data(vec_of_metadata: Vec<FileMetaData>) {
let x = FileHashes {
vec_file_metadata: vec_of_metadata,
};
let y = serde_json::to_string_pretty(&x).unwrap();
let json_filepath = crate::PATH_FILE_HASHES_JSON.as_path();
let _f = std::fs::write(json_filepath, y);
}