ietf

CLI for reading IETF RFCs.
git clone https://gitlab.com/kwatafana/p2p/ietf.git
Log | Files | Refs | README | LICENSE

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 }