price_checker/src/main.rs

90 lines
2.6 KiB
Rust
Raw Normal View History

2020-05-24 08:30:41 +00:00
extern crate anyhow;
2020-07-20 20:14:05 +00:00
extern crate arraygen;
2020-06-02 17:55:06 +00:00
extern crate clap;
2020-06-21 09:32:40 +00:00
extern crate url;
2020-05-24 08:30:41 +00:00
2020-05-11 19:21:57 +00:00
pub mod parser;
pub mod price_checker;
2020-07-20 20:14:05 +00:00
pub mod price_result;
2020-05-11 19:21:57 +00:00
2020-07-20 20:14:05 +00:00
use anyhow::Result;
2020-07-21 16:52:52 +00:00
use clap::{crate_version, App, Arg, SubCommand};
2020-05-11 19:21:57 +00:00
use price_checker::PriceChecker;
2020-07-20 20:14:05 +00:00
use price_result::PriceResult;
2020-05-23 14:19:04 +00:00
use url::Url;
2020-05-11 19:21:57 +00:00
2020-05-24 08:30:41 +00:00
fn main() -> Result<()> {
2020-06-02 17:55:06 +00:00
let matches = App::new("Price checker")
2020-07-21 16:52:52 +00:00
.version(crate_version!())
2020-07-20 20:14:05 +00:00
.author("Rémi BERTHO <remi.bertho@dalan.fr>")
.about("Check price")
.subcommand(
2020-07-21 18:37:26 +00:00
SubCommand::with_name("get")
.about("Get a price from an URL")
2020-07-20 20:14:05 +00:00
.arg(Arg::with_name("URL").required(true).multiple(true).help("The URL to get price")),
)
.subcommand(
SubCommand::with_name("search")
.about("Search an object")
2020-07-21 18:37:26 +00:00
.arg(Arg::with_name("parser")
.short("w")
.long("website")
.value_name("WEBSITE")
.help("Website name")
.takes_value(true))
2020-07-20 20:14:05 +00:00
.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();
2020-06-23 16:29:55 +00:00
let price_checker = PriceChecker::new().unwrap();
2020-06-02 17:55:06 +00:00
match matches.subcommand() {
2020-07-21 18:37:26 +00:00
("get", Some(check_matches)) => {
2020-06-02 17:55:06 +00:00
for url_str in check_matches.values_of("URL").unwrap() {
let url = Url::parse(url_str)?;
2020-07-20 20:14:05 +00:00
println!("{}", price_checker.get_price(&url)?);
2020-06-23 16:29:55 +00:00
}
2020-07-20 20:14:05 +00:00
}
("search", Some(check_matches)) => {
2020-07-21 18:37:26 +00:00
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 {
2020-06-23 16:29:55 +00:00
for name in check_matches.values_of("name").unwrap() {
2020-07-21 18:37:26 +00:00
let res = price_checker.search_all(name)?;
2020-06-23 16:29:55 +00:00
if res.is_empty() {
println!("«{}» not found", name);
} else {
for (parser_name, url) in res {
let price = price_checker.get_price(&url)?;
2020-07-21 18:37:26 +00:00
println!(" - {} : {}", name, parser_name);
2020-06-23 16:29:55 +00:00
println!(" * {}", url);
println!(" * {}", price);
}
}
2020-06-02 17:55:06 +00:00
}
2020-07-20 20:14:05 +00:00
}
2020-07-21 18:37:26 +00:00
}
2020-07-20 19:56:49 +00:00
("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());
}
2020-07-20 20:14:05 +00:00
}
_ => {
2020-06-02 17:55:06 +00:00
println!("{}", matches.usage());
2020-07-20 20:14:05 +00:00
}
2020-06-02 17:55:06 +00:00
}
2020-05-24 08:30:41 +00:00
Ok(())
2020-05-11 18:32:43 +00:00
}