mod xml;
use std::io::Write;
use anyhow::Context;
use anyhow::Error;
use anyhow::Result;
use tracing::info;
pub(crate) fn generate_sitemap<W>(
links: Vec<crate::link::Link<'_>>,
base_url: url::Url,
w: &mut W,
) -> Result<()>
where
W: Write,
{
let exclude = ["refs.md", "SUMMARY.md"];
let ls = links
.into_iter()
.filter(|l| !exclude.iter().any(|&ex| l.get_url().ends_with(ex)));
let ls = ls.map(|l| {
base_url.join(
l.get_url()
.replace("intro.md", "index.md")
.replace(".md", ".html")
.as_str(),
)
});
let (links, errors): (Vec<Result<_, _>>, Vec<Result<_, _>>) = ls.partition(Result::is_ok);
let mut links: Vec<String> = links.into_iter().map(|r| r.unwrap().to_string()).collect();
let errors: Vec<Error> = errors.into_iter().map(|r| r.unwrap_err().into()).collect();
if !errors.is_empty() {
tracing::error!("Errors: {:?}", errors);
}
links.dedup();
links.sort();
xml::write_xml(links, w).context("[generate_sitemap] Failed to write the XML.")?;
info!("sitemap.xml created.");
Ok(())
}
#[cfg(test)]
mod test {
}