use std::{process, thread::sleep, time::Duration};
use wallswitch::*;
fn main() {
let run_result = run();
match run_result {
Ok(_) => process::exit(0), Err(error) => {
eprintln!("{error}"); process::exit(1); }
}
}
fn run() -> WallSwitchResult<()> {
let args = Arguments::build()?;
let mut state = State::load();
let config = Config::new(&args)?;
if let Some(criteria) = args.list {
let images = gather_files(&config, &mut state)?;
list_all_images(images, criteria)?;
process::exit(0);
}
show_initial_msgs(&config)?;
kill_other_instances(&config)?;
if config.once {
try_run_cycle(&config, &mut state)
} else {
loop {
try_run_cycle(&config, &mut state)?;
}
}
}
fn try_run_cycle(config: &Config, state: &mut State) -> WallSwitchResult<()> {
let mut count: usize = 0;
let images: Vec<FileInfo> = get_images(config, state)?;
if config.verbose {
display_files(&images, config);
}
let images_per_cycle = config.get_number_of_images();
'next_chunk: for files in images.chunks_exact(images_per_cycle) {
if !files.sizes_are_valid(config) {
continue 'next_chunk;
}
let figures: Vec<FileInfo> = update_images(files, config);
print!("{}", SliceDisplay(&figures));
for figure in &figures {
let dimension = figure.dimension_is_valid(config);
let file_name = figure.name_is_valid(config);
if !dimension || !file_name {
continue 'next_chunk;
}
}
set_wallpaper(&figures, config)?;
count += 1;
for fig in &figures {
state.history.push(fig.path.clone());
}
state.save()?;
if config.once {
break 'next_chunk;
}
sleep(Duration::from_secs(config.interval));
}
if count == 0 {
return Err(WallSwitchError::InsufficientNumber);
}
Ok(())
}