fetch.rs (2921B)
1 // Download RFC index file 2 pub fn index() -> Result<Vec<String>, minreq::Error> { 3 let response = minreq::get("https://www.rfc-editor.org/rfc-index.txt").send()?; 4 let data = scrape(response.as_str()?); 5 Ok(data) 6 } 7 8 // Download RFC localy 9 pub fn rfc(sn: u32) -> Result<String, minreq::Error> { 10 let address = format!("https://www.rfc-editor.org/rfc/rfc{}.txt", sn); 11 let response = minreq::get(&address).send()?; 12 Ok(String::from(response.as_str()?)) 13 } 14 15 pub fn scrape(data: &str) -> Vec<String> { 16 let mut rfcs = vec![]; 17 let mut iter = data.lines().skip(66).peekable(); 18 19 while iter.peek().is_some() { 20 rfcs.push( 21 iter.by_ref() 22 .take_while(|s| !s.is_empty()) 23 .fold(String::new(), |acc, s| acc + s), 24 ); 25 } 26 27 rfcs 28 } 29 30 #[cfg(test)] 31 mod tests { 32 use super::*; 33 34 #[test] 35 fn single_rfc_scrape() { 36 let data = String::from("\n".repeat(66)) 37 + "8989 Additional Criteria for Nominating Committee Eligibility. B.\n" 38 + " Carpenter, S. Farrell. February 2021. (Format: HTML, TXT, PDF, XML)\n" 39 + " (Status: EXPERIMENTAL) (DOI: 10.17487/RFC8989) \n"; 40 41 let rfcs = vec![ 42 String::from("8989 Additional Criteria for Nominating Committee Eligibility. B.") 43 + " Carpenter, S. Farrell. February 2021. (Format: HTML, TXT, PDF, XML)" 44 + " (Status: EXPERIMENTAL) (DOI: 10.17487/RFC8989) ", 45 ]; 46 47 assert_eq!(rfcs, scrape(&data)); 48 } 49 50 #[test] 51 fn multi_rfc_scrape() { 52 let data = String::from("\n".repeat(66)) 53 + "8989 Additional Criteria for Nominating Committee Eligibility. B.\n" 54 + " Carpenter, S. Farrell. February 2021. (Format: HTML, TXT, PDF, XML)\n" 55 + " (Status: EXPERIMENTAL) (DOI: 10.17487/RFC8989) \n" 56 + "\n" 57 + "9003 Extended BGP Administrative Shutdown Communication. J. Snijders, J.\n" 58 + " Heitz, J. Scudder, A. Azimov. January 2021. (Format: HTML, TXT, PDF,\n" 59 + " XML) (Obsoletes RFC8203) (Updates RFC4486) (Status: PROPOSED\n" 60 + " STANDARD) (DOI: 10.17487/RFC9003) \n"; 61 62 let rfcs = vec![ 63 String::from("8989 Additional Criteria for Nominating Committee Eligibility. B.") 64 + " Carpenter, S. Farrell. February 2021. (Format: HTML, TXT, PDF, XML)" 65 + " (Status: EXPERIMENTAL) (DOI: 10.17487/RFC8989) ", 66 String::from( 67 "9003 Extended BGP Administrative Shutdown Communication. J. Snijders, J.", 68 ) + " Heitz, J. Scudder, A. Azimov. January 2021. (Format: HTML, TXT, PDF," 69 + " XML) (Obsoletes RFC8203) (Updates RFC4486) (Status: PROPOSED" 70 + " STANDARD) (DOI: 10.17487/RFC9003) ", 71 ]; 72 73 assert_eq!(rfcs, scrape(&data)); 74 } 75 }