#[macro_use] extern crate log; use std::process::exit; use gclone::{first_arg, Cache, Error, Result}; fn main() { beautylog::init(log::LevelFilter::Info).ok(); if let Err(e) = main_result() { error!("{}", e); exit(1); } } fn main_result() -> Result<()> { let request = first_arg()?; main_with_cache(&request, true) } fn main_with_cache(request: &str, regen: bool) -> Result<()> { let (cache, just_generated) = match Cache::read() { Ok(c) => (c, false), Err(_) => { let cache = Cache::generate(); cache.write()?; (cache, true) } }; let only_match = match cache.find_interactive(&request) { Err(Error::NoSuchDirectory) if regen && !just_generated => { warn!("directory not found, regenerating cache..."); let cache = Cache::generate(); cache.write()?; return main_with_cache(request, false); } Err(e) => return Err(e), Ok(x) => x, }; println!("{}", only_match); Ok(()) }