extern crate anyhow; extern crate arraygen; extern crate clap; extern crate url; pub mod parser; pub mod price_checker; pub mod price_result; use anyhow::Result; use clap::{crate_version, App, Arg, SubCommand}; use price_checker::PriceChecker; use price_result::PriceResult; use url::Url; fn main() -> Result<()> { let matches = App::new("Price checker") .version(crate_version!()) .author("Rémi BERTHO ") .about("Check price") .subcommand( SubCommand::with_name("get") .about("Get a price from an URL") .arg(Arg::with_name("URL").required(true).multiple(true).help("The URL to get price")), ) .subcommand( SubCommand::with_name("search") .about("Search an object") .arg(Arg::with_name("parser") .short("w") .long("website") .value_name("WEBSITE") .help("Website name") .takes_value(true)) .arg(Arg::with_name("name").required(true).multiple(true).help("The name of the object")), ) .subcommand(SubCommand::with_name("list").about("List the parsers")) .get_matches(); let price_checker = PriceChecker::new().unwrap(); match matches.subcommand() { ("get", Some(check_matches)) => { for url_str in check_matches.values_of("URL").unwrap() { let url = Url::parse(url_str)?; println!("{}", price_checker.get_price(&url)?); } } ("search", Some(check_matches)) => { if let Some(parser) = check_matches.value_of("parser") { for name in check_matches.values_of("name").unwrap() { if let Some(url) = price_checker.search(parser, name)? { let price = price_checker.get_price(&url)?; println!(" - {}", name); println!(" * {}", url); println!(" * {}", price); } } } else { for name in check_matches.values_of("name").unwrap() { let res = price_checker.search_all(name)?; if res.is_empty() { println!("«{}» not found", name); } else { for (parser_name, url) in res { let price = price_checker.get_price(&url)?; println!(" - {} : {}", name, parser_name); println!(" * {}", url); println!(" * {}", price); } } } } } ("list", _) => { println!("Price parsers:"); for parser in price_checker.parser_list.get_price().iter() { println!(" - {}", parser.name()); } println!("Search parsers:"); for parser in price_checker.parser_list.get_search().iter() { println!(" - {}", parser.name()); } } _ => { println!("{}", matches.usage()); } } Ok(()) }