From 7f7139461b5f548f29200740b806bbacb4a551b9 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Wed, 12 Jul 2023 10:11:05 -0300 Subject: [PATCH] Fixed the code (but it doesnt stop when there is no more data yet) --- internetiterator/src/main.rs | 43 ++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/internetiterator/src/main.rs b/internetiterator/src/main.rs index 432a656..fda79b5 100644 --- a/internetiterator/src/main.rs +++ b/internetiterator/src/main.rs @@ -1,4 +1,4 @@ -use std::slice::Iter; +use std::vec::IntoIter; use reqwest::blocking::Client; use serde::{de::DeserializeOwned, Deserialize}; @@ -16,7 +16,7 @@ struct Punk { impl Punk { pub fn new(/* connection information here */) -> Self { Self { - url: "https://api.punkapi.com/v2/".into(), + url: "https://api.punkapi.com/v2/beers?per_page=10".into(), client: Client::builder() .user_agent(LIB_USER_AGENT) .build() @@ -32,7 +32,9 @@ impl Punk { } pub fn get(&self, page: u16) -> Result { - Ok(self.client.get(&self.url).send()?.json::()?) + let url = format!("{url}&page={page}", url=self.url, page=page); + let data = self.client.get(&url).send()?; + Ok(data.json::()?) } } @@ -48,8 +50,7 @@ struct Beer { /// This is the magical iterator that gets stuff from the internet struct BeerIter<'a> { connection: &'a Punk, - data: Vec, - iter: Option>, + iter: IntoIter, page: u16, } @@ -57,9 +58,8 @@ impl<'a> BeerIter<'a> { pub fn new(connection: &'a Punk) -> Result { let mut result = Self { connection, - data: Vec::new(), - iter: None, - page: 1 + iter: vec![].into_iter(), + page: 1, }; result.next_page()?; Ok(result) @@ -67,22 +67,23 @@ impl<'a> BeerIter<'a> { fn next_page(&mut self) -> Result<(), reqwest::Error> { let page = self.connection.get::>(self.page)?; - self.data = page; - self.iter = Some(self.data.iter()); + self.iter = page.into_iter(); self.page += 1; Ok(()) } } impl<'a> Iterator for BeerIter<'a> { - type Item = &'a Beer; + type Item = Beer; fn next(&mut self) -> Option { - if let Some(record) = self.iter?.next() { - Some(record) - } else { - self.next_page(); - Some(self.iter?.next().unwrap()) + let next_item = self.iter.next(); + match next_item { + Some(record) => Some(record), + None => { + self.next_page().unwrap(); + self.next() + } } } } @@ -90,10 +91,10 @@ impl<'a> Iterator for BeerIter<'a> { fn main() { let connection = Punk::new(); let beers = connection.beers().expect("Failed to get the initial data"); - // for beer in beers { - // println!(" ID: {}", beer.id); - // println!(" Name: {}", beer.name); - // println!("Tagline: {}\n", beer.tagline); - // } + for beer in beers { + println!(" ID: {}", beer.id); + println!(" Name: {}", beer.name); + println!("Tagline: {}\n", beer.tagline); + } println!("Hello, world!"); }