use std::error::Error; use ureq; use serde_xml_rs; #[derive(Debug, Deserialize, Default)] struct Loc { #[serde(rename = "$value")] pub name: String } #[derive(Debug, Deserialize)] struct SitemapUrl { #[serde(rename = "loc", default)] pub loc: Loc } #[derive(Debug, Deserialize)] struct UrlSet { #[serde(rename = "url", default)] pub urls: Vec<SitemapUrl> } fn url_set_to_urls(urlset: UrlSet) -> Vec<String> { let v: Vec<_> = urlset.urls.iter().map(|u| u.loc.name.clone()).collect(); v } fn fetch_sitemap(sitemap_location: &String) -> Result<Vec<String>, Box<dyn Error>> { let resp = ureq::get(sitemap_location) .call() .into_string()?; let blah: UrlSet = serde_xml_rs::from_reader(resp.as_bytes())?; let sitemap_urls: Vec<String> = url_set_to_urls(blah); Ok(sitemap_urls) } pub fn get_name_from_slug(slug: &String) -> String { if slug == "" || slug == "/" { String::from("HOMEPAGE") } else { let lower = slug.clone().to_lowercase(); let lower1 = lower.replace(r"\.", "_"); let lower2 = lower1.replace(r"_", "_"); let lower3 = lower2.replace(r"/", "_"); let trimmed = lower3.trim(); trimmed.to_string() } } pub fn get_urls(the_config: &crate::config::Config) -> Result<Vec<String>, Box<dyn Error>> { if the_config.routes == String::from("sitemap") { println!("Getting urls to test from sitemap..."); let sitemap_location = String::from(the_config.trusted.clone() + "sitemap.xml"); fetch_sitemap(&sitemap_location) } else { println!("Test urls provided by environment"); // TODO: Add options for reading from a json config. Ok(the_config.routes.split(',').map(|x| x.to_string()).collect()) } }