diff --git a/Cargo.toml b/Cargo.toml index 85672c2..1964793 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "sitewriter" -version = "0.2.4" -authors = ["Edgar L. "] +version = "0.3.0" +authors = ["Edgar "] edition = "2018" description = "A sitemap writing library." readme = "README.md" @@ -11,9 +11,6 @@ license = "MIT" keywords = ["sitemap", "sitemapindex", "xml", "parser"] categories = ["parsing"] -[features] -default = ["chrono"] - [dependencies] -chrono = { version = "0.4", optional = true } +chrono = "0.4" quick-xml = "0.20" diff --git a/examples/gen_sitemap.rs b/examples/gen_sitemap.rs index b50e307..d5b5bab 100644 --- a/examples/gen_sitemap.rs +++ b/examples/gen_sitemap.rs @@ -3,7 +3,9 @@ use sitewriter::*; fn main() { let mut sitemap = Sitemap::new(); - sitemap.urls.push(Url::new("https://edgarluque.com/projects".to_owned())); + sitemap + .urls + .push(Url::new("https://edgarluque.com/projects".to_owned())); sitemap.urls.push(Url { loc: "https://edgarluque.com/".to_owned(), @@ -30,10 +32,11 @@ fn main() { loc: "https://edgarluque.com/blog/some-future-post".to_owned(), changefreq: Some(ChangeFreq::Never), priority: Some(0.5), - lastmod: Some(Utc.from_utc_datetime(&Local.ymd(2020, 12, 5).and_hms(12, 30, 0).naive_utc())), + lastmod: Some( + Utc.from_utc_datetime(&Local.ymd(2020, 12, 5).and_hms(12, 30, 0).naive_utc()), + ), }); - let result = sitemap.into_str(); println!("{}", result); } diff --git a/src/lib.rs b/src/lib.rs index 7229c8a..a0ca241 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,5 @@ //! ## A rust library to generate sitemaps. -//! +//! //! It uses the [quick-xml](https://github.com/tafia/quick-xml) so it should be fast. //! //! To handle the [`Url::lastmod`] tag it uses [chrono](https://docs.rs/chrono/) but it can be disabled with `default-features = false`. @@ -9,47 +9,46 @@ //! ```rust //! use chrono::prelude::*; //! use sitewriter::*; -//! +//! //! fn main() { //! let mut sitemap = Sitemap::new(); //! sitemap.urls.push(Url::new("https://edgarluque.com/projects".to_owned())); -//! +//! //! sitemap.urls.push(Url { //! loc: "https://edgarluque.com/".to_owned(), //! changefreq: Some(ChangeFreq::Daily), //! priority: Some(1.0), //! lastmod: Some(Utc::now()), //! }); -//! +//! //! sitemap.urls.push(Url { //! loc: "https://edgarluque.com/blog".to_owned(), //! changefreq: Some(ChangeFreq::Weekly), //! priority: Some(0.8), //! lastmod: Some(Utc::now()), //! }); -//! +//! //! sitemap.urls.push(Url { //! loc: "https://edgarluque.com/blog/sitewriter".to_owned(), //! changefreq: Some(ChangeFreq::Never), //! priority: Some(0.5), //! lastmod: Some(Utc.ymd(2020, 11, 22).and_hms(15, 10, 15)), //! }); -//! +//! //! sitemap.urls.push(Url { //! loc: "https://edgarluque.com/blog/some-future-post".to_owned(), //! changefreq: Some(ChangeFreq::Never), //! priority: Some(0.5), //! lastmod: Some(Utc.from_utc_datetime(&Local.ymd(2020, 12, 5).and_hms(12, 30, 0).naive_utc())), //! }); -//! -//! +//! +//! //! let result = sitemap.into_str(); //! println!("{}", result); //! } //! ``` -#[cfg(feature = "chrono")] -use chrono::{DateTime, Utc, SecondsFormat}; +use chrono::{DateTime, SecondsFormat, Utc}; use quick_xml::{ events::{BytesDecl, BytesEnd, BytesStart, BytesText, Event}, @@ -58,7 +57,6 @@ use quick_xml::{ use std::fmt::Display; use std::io::Cursor; -use std::borrow::Cow; /// How frequently the page is likely to change. This value provides general information to search engines and may not correlate exactly to how often they crawl the page. #[derive(Debug, Eq, PartialEq)] @@ -101,14 +99,8 @@ pub struct Url { /// /// This URL must begin with the protocol (such as http) and end with a trailing slash, if your web server requires it. This value must be less than 2,048 characters. pub loc: String, - #[cfg(feature = "chrono")] /// The date of last modification of the file. pub lastmod: Option>, - #[cfg(not(feature = "chrono"))] - /// The date of last modification of the file. - /// - /// This date should be in W3C Datetime format. This format allows you to omit the time portion, if desired, and use YYYY-MM-DD. - pub lastmod: Option, /// How frequently the page is likely to change. pub changefreq: Option, /// The priority of this URL relative to other URLs on your site. Valid values range from 0.0 to 1.0. @@ -124,7 +116,7 @@ impl Url { loc, lastmod: None, changefreq: None, - priority: None + priority: None, } } } @@ -151,9 +143,7 @@ fn write_tag(writer: &mut Writer, tag: &str, text: &str) { impl Sitemap { /// Create a new sitemap. pub fn new() -> Self { - Self { - urls: Vec::new(), - } + Self { urls: Vec::new() } } /// Generates the sitemap using the provided writer. @@ -181,17 +171,12 @@ impl Sitemap { .expect("error opening url"); write_tag(&mut writer, "loc", &url.loc); - #[cfg(feature = "chrono")] - { - if let Some(lastmod) = &url.lastmod { - write_tag(&mut writer, "lastmod", &lastmod.to_rfc3339_opts(SecondsFormat::Secs, true)); - } - } - #[cfg(not(feature = "chrono"))] - { - if let Some(lastmod) = &url.lastmod { - write_tag(&mut writer, "lastmod", lastmod); - } + if let Some(lastmod) = &url.lastmod { + write_tag( + &mut writer, + "lastmod", + &lastmod.to_rfc3339_opts(SecondsFormat::Secs, true), + ); } if let Some(priority) = &url.priority { write_tag(&mut writer, "priority", &format!("{:.1}", priority)) @@ -213,17 +198,17 @@ impl Sitemap { } /// Generates the sitemap. - pub fn into_bytes(&self) -> Cow<[u8]> { + pub fn into_bytes(self) -> Vec { let inner = Cursor::new(Vec::new()); let result = self.generate(inner); - Cow::Owned(result.into_inner()) + result.into_inner() } /// Generates the sitemap returning a string. - pub fn into_str(&self) -> Cow { + pub fn into_str(self) -> String { let bytes = self.into_bytes(); - let res = std::str::from_utf8(&bytes).expect("error parsing sitemap bytes to str").to_owned(); - Cow::Owned(res) + let res = std::str::from_utf8(&bytes).expect("error parsing sitemap bytes to str"); + res.to_owned() } } @@ -237,15 +222,30 @@ mod tests { use chrono::Utc; let mut sitemap = Sitemap::new(); - sitemap.urls.push(Url::new("https://domain.com/".to_owned())); + sitemap + .urls + .push(Url::new("https://domain.com/".to_owned())); sitemap.urls.push(Url { - loc: "https://domain.com/url".to_owned(), - changefreq: Some(ChangeFreq::Daily), - priority: Some(0.8), - lastmod: Some(Utc::now()) - } - ); + loc: "https://domain.com/url".to_owned(), + changefreq: Some(ChangeFreq::Daily), + priority: Some(0.8), + lastmod: Some(Utc::now()), + }); + + sitemap.urls.push(Url { + loc: "https://domain.com/aa".to_owned(), + changefreq: Some(ChangeFreq::Monthly), + priority: None, + lastmod: None, + }); + + sitemap.urls.push(Url { + loc: "https://domain.com/bb".to_owned(), + changefreq: None, + priority: None, + lastmod: None, + }); sitemap.into_str(); } @@ -260,21 +260,4 @@ mod tests { assert_eq!(format!("{}", ChangeFreq::Yearly), "yearly"); assert_eq!(format!("{}", ChangeFreq::Never), "never"); } - - #[cfg(not(feature = "chrono"))] - #[test] - fn it_works() { - let mut sitemap = Sitemap::new(); - sitemap.urls.push(Url::new("https://domain.com/".to_owned())); - - sitemap.urls.push(Url { - loc: "https://domain.com/url".to_owned(), - changefreq: Some(ChangeFreq::Daily), - priority: Some(0.8), - lastmod: Some("2020-11-22".to_owned()), - } - ); - - sitemap.into_str(); - } }