use std::fs::File; use std::path::{Path, PathBuf}; use anyhow::Result; use clap::Parser as ArgParser; use jrny_save::Savefile; use crate::Args as AppArgs; #[derive(Debug, Clone, ArgParser)] pub struct Args { path: PathBuf, #[cfg(feature = "watch")] #[arg(long, default_value_t = false)] watch: bool, } pub(crate) fn execute(_app_args: &AppArgs, args: &Args) -> Result<()> { if !args.path.exists() { anyhow::bail!("Could not find file at given path"); } show_all_info(&args.path)?; #[cfg(feature = "watch")] if args.watch { watch_all_info(&args.path)?; } Ok(()) } #[cfg(feature = "watch")] fn watch_all_info

(path: P) -> Result<()> where P: AsRef, { use std::sync::mpsc; use crate::watcher::FileWatcher; let (tx, rx) = mpsc::channel(); let _watcher = FileWatcher::new(path.as_ref(), move || { tx.send(()).unwrap(); }); println!("Watching file for changes..."); loop { let _ = rx.recv()?; show_all_info(&path).unwrap(); } } fn show_all_info

(path: P) -> Result<()> where P: AsRef, { let file = File::open(path)?; let savefile = Savefile::from_reader(file)?; println!("------======::::: WAYFARER :::::======------\n"); general_info(&savefile); println!("\n---===---===---===---===---===---===---===---\n"); current_journey(&savefile); println!("\n---===---===---===---===---===---===---===---\n"); glyphs(&savefile); println!("\n---===---===---===---===---===---===---===---\n"); murals(&savefile); println!("\n---===---===---===---===---===---===---===---\n"); current_companions(&savefile); println!("\n---===---===---===---===---===---===---===---\n"); past_companions(&savefile); println!("\n------======::::::::::::::::::::======------"); Ok(()) } fn general_info(savefile: &Savefile) { println!("Journeys Completed: {:>}", savefile.journey_count); println!("Total Companions Met: {:>}", savefile.total_companions_met); println!( "Total Symbols Collected: {}", savefile.total_collected_symbols ); } fn current_journey(savefile: &Savefile) { println!("Current Level: {:<10}", savefile.current_level_name()); println!("Companions Met: {:<10}", savefile.companions_met); println!("Scarf Length: {:<10}", savefile.scarf_length); println!("Symbol Number: {:<10}", savefile.symbol.id); println!( "Robe: {:<10}, Tier {}", savefile.robe_color(), savefile.robe_tier() ); println!("Last Played: {:<10}", savefile.last_played); } fn current_companions(savefile: &Savefile) { for companion in savefile.current_companions() { println!( "{:24} {}", companion.name, companion.steam_url().to_string() ); } } fn past_companions(savefile: &Savefile) { for companion in savefile.past_companions() { println!( "{:24} {}", companion.name, companion.steam_url().to_string() ); } } fn glyphs(savefile: &Savefile) { for (level, glyphs) in savefile.glyphs.all() { print!("{:<16} ", jrny_save::LEVEL_NAMES[level]); for glyph in glyphs { print!("{:3}", if glyph { "X" } else { "O" }); } println!(); } } fn murals(savefile: &Savefile) { for (level, murals) in savefile.murals.all() { print!("{:<16} ", jrny_save::LEVEL_NAMES[level]); for mural in murals { print!("{:3}", if mural { "X" } else { "O" }); } println!(); } }