use rayon::prelude::*; fn main() { let mut args = std::env::args(); let path = args.nth(1).unwrap_or_default(); let mut key = None; if let Some(hash) = args.next() { match hex::decode(hash.trim_start_matches("0x")) { Ok(bytes) => key = Some(bytes), Err(e) => { eprintln!("hex: {e}"); std::io::stdin().read_line(&mut String::new()).unwrap(); return; } } } match unpack(&path, key.as_deref()) { Ok(_) => println!("unpacked successfully"), Err(e) => eprintln!("{e}"), } std::io::stdin().read_line(&mut String::new()).unwrap(); } fn unpack(path: &str, key: Option<&[u8]>) -> Result<(), unpak::Error> { let pak = unpak::Pak::new_any(path, key)?; pak.entries() .into_par_iter() .try_for_each(|entry| -> Result<(), unpak::Error> { std::fs::create_dir_all(std::path::Path::new(&entry).parent().unwrap())?; pak.read_to_file(&entry, &entry)?; println!("{entry}"); Ok(()) })?; Ok(()) }