diff --git a/TODO.md b/TODO.md index 88a3548..d044984 100644 --- a/TODO.md +++ b/TODO.md @@ -3,12 +3,13 @@ * [x] Récupération prix darty avec [scraper](https://crates.io/crates/scraper) et [reqwest](https://crates.io/crates/reqwest) * [x] Ajout du support de la Fnac, … * [x] Récupération URL ligne de commande avec [clap](https://crates.io/crates/clap) -* [ ] Ajout de SearchParser pour rechercher un article sur tous les parseurs -* [ ] Commande de liste des différents parseurs +* [ ] Ajout de SearchParser pour rechercher un article sur tous les parseurs - retour si pas trouvé - recherche sur un seul parser +* [x] Commande de liste des différents parseurs * [ ] Ajout des pays avec [celes](https://crates.io/crates/celes) : recherche uniquement sur les parser du pays et parseur multi pays (amazon par exemple) * [ ] Lecture des URLs depuis un fichier avec [toml](https://crates.io/crates/toml) * [ ] Parallélisation des requêtes avce [rayon](rayon) ou reqwest asynchrone * [ ] Écriture dans un fichier ODS avec [calamine](https://crates.io/crates/calamine) * [ ] Notification si baisse de prix avec [notify-rust](https://crates.io/crates/notify-rust) * [ ] Mail si baisse de prix avec [lettre](https://crates.io/crates/lettre) -* [ ] Lancement de la recherche régulière avec [Clokwerk](https://crates.io/crates/clokwerk) \ No newline at end of file +* [ ] Lancement de la recherche régulière avec [Clokwerk](https://crates.io/crates/clokwerk) +* [ ] UI avec [Iced](https://crates.io/crates/iced) \ No newline at end of file diff --git a/TODO.md~ b/TODO.md~ new file mode 100644 index 0000000..88a3548 --- /dev/null +++ b/TODO.md~ @@ -0,0 +1,14 @@ +# TODO + +* [x] Récupération prix darty avec [scraper](https://crates.io/crates/scraper) et [reqwest](https://crates.io/crates/reqwest) +* [x] Ajout du support de la Fnac, … +* [x] Récupération URL ligne de commande avec [clap](https://crates.io/crates/clap) +* [ ] Ajout de SearchParser pour rechercher un article sur tous les parseurs +* [ ] Commande de liste des différents parseurs +* [ ] Ajout des pays avec [celes](https://crates.io/crates/celes) : recherche uniquement sur les parser du pays et parseur multi pays (amazon par exemple) +* [ ] Lecture des URLs depuis un fichier avec [toml](https://crates.io/crates/toml) +* [ ] Parallélisation des requêtes avce [rayon](rayon) ou reqwest asynchrone +* [ ] Écriture dans un fichier ODS avec [calamine](https://crates.io/crates/calamine) +* [ ] Notification si baisse de prix avec [notify-rust](https://crates.io/crates/notify-rust) +* [ ] Mail si baisse de prix avec [lettre](https://crates.io/crates/lettre) +* [ ] Lancement de la recherche régulière avec [Clokwerk](https://crates.io/crates/clokwerk) \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 551a004..e52d3e6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,6 +30,8 @@ fn main() -> Result<()> { .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() { @@ -54,6 +56,16 @@ fn main() -> Result<()> { } } }, + ("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()); }, diff --git a/src/parser/amazon.rs b/src/parser/amazon.rs index b61fac1..2ec8127 100644 --- a/src/parser/amazon.rs +++ b/src/parser/amazon.rs @@ -64,12 +64,15 @@ impl SearchParser for Amazon { } fn search(&self, html : &Html) -> Result> { - let search_element_1 = html.select(&self.search_selector_1).next().ok_or(anyhow!("No search element 1"))?; - let search_element_2 = search_element_1.select(&self.search_selector_2).next().ok_or(anyhow!("No search element 2"))?; - let path_url = search_element_2.value().attr("href").ok_or(anyhow!("No link element"))?; - let mut url = Url::parse("https://www.amazon.fr").unwrap(); - url.set_path(path_url.split("/ref").next().unwrap_or(path_url)); - Ok(Option::Some(url)) + if let Some(search_element_1) = html.select(&self.search_selector_1).next() { + let search_element_2 = search_element_1.select(&self.search_selector_2).next().ok_or(anyhow!("No search element 2"))?; + let path_url = search_element_2.value().attr("href").ok_or(anyhow!("No link element"))?; + let mut url = Url::parse("https://www.amazon.fr").unwrap(); + url.set_path(path_url.split("/ref").next().unwrap_or(path_url)); + Ok(Option::Some(url)) + } else { + Ok(None) + } } } diff --git a/src/price_checker.rs b/src/price_checker.rs index 8251226..0d15e3a 100644 --- a/src/price_checker.rs +++ b/src/price_checker.rs @@ -13,7 +13,7 @@ const USER_AGENT: &str = "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/2010010 /// Struct used to get price from a website pub struct PriceChecker { client: Client, - parser_list: parser::List + pub parser_list: parser::List } impl PriceChecker {