use crate::models::NewFile; use anyhow::Result; use filebuffer::FileBuffer; use log::info; use std::fs; use std::io; use std::path::{Path, PathBuf}; use tiny_keccak::{Hasher, KangarooTwelve}; use walkdir::WalkDir; use actix::prelude::*; // use rayon::prelude::*; // pub struct VaultUpdater( // pub Addr, // pub Addr, // ); // impl Actor for VaultUpdater { // type Context = Context; // } // struct UpdateDirectory<'a> { // path: &'a Path, // } // impl Message for UpdateDirectory<'_> { // type Result = Result<(), Box>; // } // impl Handler> for VaultUpdater { // type Result = Result<(), Box>; // fn handle(&mut self, msg: UpdateDirectory, _: &mut Self::Context) -> Self::Result { // update_directory(msg.path, &self.0, &self.1).await // } // } pub async fn update_directory>( directory: T, db_executor: &Addr, hasher_worker: &Addr, ) -> Result<()> { for entry in WalkDir::new(&directory) .into_iter() .filter_map(|e| e.ok()) .filter(|e| e.path().is_file()) { info!("Processing: {}", entry.path().display()); let metadata = fs::metadata(entry.path())?; let size = metadata.len() as i64; if size < 0 { panic!("File {} too large?!", entry.path().display()); } let msg = ComputeHash { path: entry.path().to_path_buf(), }; let digest = hasher_worker.send(msg).await; let new_file = NewFile { path: entry .path() .to_str() .expect("path not valid unicode?!") .to_string(), hash: digest.unwrap().unwrap(), size: size, }; let _insert_result = db_executor .send(crate::database::InsertFile { file: new_file }) .await?; } info!("Finished updating {}.", directory.as_ref().display()); Ok(()) } pub struct HasherWorker; impl Actor for HasherWorker { type Context = SyncContext; } #[derive(Message)] #[rtype(result = "Result")] struct ComputeHash { path: PathBuf, } impl Handler for HasherWorker { type Result = Result; fn handle(&mut self, msg: ComputeHash, _: &mut Self::Context) -> Self::Result { compute_digest(msg.path) } } pub fn compute_digest>(filepath: P) -> Result { let fbuffer = FileBuffer::open(&filepath)?; let mut k12 = KangarooTwelve::new(b""); k12.update(&fbuffer); let mut result = [0u8; 256 / 8]; k12.finalize(&mut result); Ok(bs58::encode(&result).into_string()) }