rua 0.19.10

Secure jailed AUR helper for Arch Linux
use crate::print_package_table;
use raur::blocking::Raur;
use raur::Package;
use raur::SearchBy;

fn contains_keyword(pkg: &Package, keyword: &str) -> bool {
	let filter = keyword.to_lowercase();
	pkg.name.to_lowercase().contains(filter.as_str())
		|| pkg
			.description
			.iter()
			.any(|descr| descr.to_lowercase().contains(filter.as_str()))
}

pub fn action_search(keywords: &[String]) {
	let mut keywords = Vec::from(keywords);
	keywords.sort_by_key(|t| -(t.len() as i16));
	let query = keywords
		.first()
		.expect("Zero search arguments, should be impossible in structopt");
	let raur_handle = raur::blocking::Handle::new();
	let result = raur_handle.search_by(query, SearchBy::NameDesc);
	match result {
		Ok(mut result) => {
			if result.is_empty() {
				std::process::exit(1)
			};
			for keyword in &keywords[1..] {
				result.retain(|pkg| contains_keyword(pkg, keyword));
			}
			print_package_table::print_package_table(result, &keywords)
		}
		Err(e) => eprintln!("Search error: {:?}", e),
	}
}