extern crate anyhow; extern crate clap; extern crate url; extern crate arraygen; pub mod price_result; pub mod parser; pub mod price_checker; use price_result::PriceResult; use price_checker::PriceChecker; use url::Url; use anyhow::Result; use clap::{Arg, App, SubCommand}; fn main() -> Result<()> { let matches = App::new("Price checker") .version("0.1") .author("Rémi BERTHO ") .about("Check price") .subcommand(SubCommand::with_name("check") .about("Check 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("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() { ("check", 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)) => { for name in check_matches.values_of("name").unwrap() { let res = price_checker.search(name)? ; if res.is_empty() { println!("«{}» not found", name); } else { for (parser_name, url) in res { let price = price_checker.get_price(&url)?; println!(" - {}", 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(()) }