use std::env; use std::io; use std::collections::HashMap; extern crate walkdir; use walkdir::{WalkDir, DirEntry}; extern crate chrono; extern crate crypto_hash; extern crate serde_yaml; mod format; fn main() -> io::Result<()> { for dirname in env::args().skip(1) { for e in WalkDir::new(&dirname).into_iter().filter_map(|e| e.ok()) { let hash = mkhash(&e); println!("{}", serde_yaml::to_string(&hash).unwrap()); } } Ok(()) } fn mkhash(e: &DirEntry) -> HashMap<&str, String> { let fields = vec![ ("Name", format::name(e)), ("Mtime", format::mtime(e)), ("Mode", format::mode(e)), ("Ino", format::inode(e)), ("Dev", format::dev(e)), ("Nlink", format::nlink(e)), ("Size", format::size(e)), ("Uid", format::uid(e)), ("Username", format::username(e)), ("Gid", format::gid(e)), ("Group", format::group(e)), ]; let mut hash: HashMap<&str, String> = HashMap::from(fields.iter().cloned().collect()); if let Ok(m) = e.metadata() { if m.is_file() { hash.insert("SHA256", format::sha256(e)); } } hash }