From bcf42a0c103c2039d1c08edab2e19ae49f6f0e82 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Wed, 14 Mar 2018 18:22:24 +0100 Subject: [PATCH] The wonders of serde default, take 2 --- components/config/Cargo.toml | 2 +- components/content/Cargo.toml | 2 +- components/content/src/section.rs | 2 +- components/errors/Cargo.toml | 2 +- components/front_matter/Cargo.toml | 2 +- components/front_matter/src/section.rs | 63 ++++++++------------------ components/highlighting/Cargo.toml | 2 +- components/pagination/Cargo.toml | 2 +- components/pagination/src/lib.rs | 10 ++-- components/rebuild/Cargo.toml | 2 +- components/rebuild/src/lib.rs | 6 +-- components/rendering/Cargo.toml | 2 +- components/site/Cargo.toml | 2 +- components/site/src/lib.rs | 15 ++---- components/taxonomies/Cargo.toml | 2 +- components/templates/Cargo.toml | 2 +- components/utils/Cargo.toml | 2 +- 17 files changed, 44 insertions(+), 76 deletions(-) diff --git a/components/config/Cargo.toml b/components/config/Cargo.toml index 298f8131..3515145a 100644 --- a/components/config/Cargo.toml +++ b/components/config/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "config" version = "0.1.0" -authors = ["Vincent Prouillet "] +authors = ["Vincent Prouillet "] [dependencies] toml = "0.4" diff --git a/components/content/Cargo.toml b/components/content/Cargo.toml index 07c21634..1aab5094 100644 --- a/components/content/Cargo.toml +++ b/components/content/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "content" version = "0.1.0" -authors = ["Vincent Prouillet "] +authors = ["Vincent Prouillet "] [dependencies] tera = "0.11" diff --git a/components/content/src/section.rs b/components/content/src/section.rs index 8ce6dfea..d8a9ae09 100644 --- a/components/content/src/section.rs +++ b/components/content/src/section.rs @@ -104,7 +104,7 @@ impl Section { config.highlight_theme.clone(), &self.permalink, permalinks, - self.meta.insert_anchor_links.unwrap() + self.meta.insert_anchor_links, ); let res = markdown_to_html(&self.raw_content, &context)?; self.content = res.0; diff --git a/components/errors/Cargo.toml b/components/errors/Cargo.toml index a43ee054..285bfeda 100644 --- a/components/errors/Cargo.toml +++ b/components/errors/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "errors" version = "0.1.0" -authors = ["Vincent Prouillet "] +authors = ["Vincent Prouillet "] [dependencies] error-chain = "0.11" diff --git a/components/front_matter/Cargo.toml b/components/front_matter/Cargo.toml index 564d08c7..a551ba31 100644 --- a/components/front_matter/Cargo.toml +++ b/components/front_matter/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "front_matter" version = "0.1.0" -authors = ["Vincent Prouillet "] +authors = ["Vincent Prouillet "] [dependencies] tera = "0.11" diff --git a/components/front_matter/src/section.rs b/components/front_matter/src/section.rs index 8ceedc1b..4d629ca1 100644 --- a/components/front_matter/src/section.rs +++ b/components/front_matter/src/section.rs @@ -12,6 +12,7 @@ static DEFAULT_PAGINATE_PATH: &'static str = "page"; /// The front matter of every section #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(default)] pub struct SectionFrontMatter { /// of the page pub title: Option<String>, @@ -19,11 +20,11 @@ pub struct SectionFrontMatter { pub description: Option<String>, /// Whether to sort by "date", "order", "weight" or "none". Defaults to `none`. #[serde(skip_serializing)] - pub sort_by: Option<SortBy>, + pub sort_by: SortBy, /// Used by the parent section to order its subsections. - /// Higher values means it will be at the end. + /// Higher values means it will be at the end. Defaults to `0` #[serde(skip_serializing)] - pub weight: Option<usize>, + pub weight: usize, /// Optional template, if we want to specify which template to render for that section #[serde(skip_serializing)] pub template: Option<String>, @@ -32,59 +33,38 @@ pub struct SectionFrontMatter { pub paginate_by: Option<usize>, /// Path to be used by pagination: the page number will be appended after it. Defaults to `page`. #[serde(skip_serializing)] - pub paginate_path: Option<String>, + pub paginate_path: String, /// Whether to insert a link for each header like the ones you can see in this site if you hover one /// The default template can be overridden by creating a `anchor-link.html` in the `templates` directory - pub insert_anchor_links: Option<InsertAnchor>, + pub insert_anchor_links: InsertAnchor, /// Whether to render that section or not. Defaults to `true`. /// Useful when the section is only there to organize things but is not meant /// to be used directly, like a posts section in a personal site #[serde(skip_serializing)] - pub render: Option<bool>, + pub render: bool, /// Whether to redirect when landing on that section. Defaults to `None`. /// Useful for the same reason as `render` but when you don't want a 404 when /// landing on the root section page #[serde(skip_serializing)] pub redirect_to: Option<String>, + /// Whether the section content and its pages/subsections are included in the index. + /// Defaults to `true` but is only used if search if explicitely enabled in the config. + #[serde(skip_serializing)] + pub in_search_index: bool, /// Any extra parameter present in the front matter - pub extra: Option<HashMap<String, Value>>, + pub extra: HashMap<String, Value>, } impl SectionFrontMatter { pub fn parse(toml: &str) -> Result<SectionFrontMatter> { - let mut f: SectionFrontMatter = match toml::from_str(toml) { + let f: SectionFrontMatter = match toml::from_str(toml) { Ok(d) => d, Err(e) => bail!(e), }; - if f.paginate_path.is_none() { - f.paginate_path = Some(DEFAULT_PAGINATE_PATH.to_string()); - } - - if f.render.is_none() { - f.render = Some(true); - } - - if f.sort_by.is_none() { - f.sort_by = Some(SortBy::None); - } - - if f.insert_anchor_links.is_none() { - f.insert_anchor_links = Some(InsertAnchor::None); - } - - if f.weight.is_none() { - f.weight = Some(0); - } - Ok(f) } - /// Returns the current sorting method, defaults to `None` (== no sorting) - pub fn sort_by(&self) -> SortBy { - self.sort_by.unwrap() - } - /// Only applies to section, whether it is paginated or not. pub fn is_paginated(&self) -> bool { match self.paginate_by { @@ -92,10 +72,6 @@ impl SectionFrontMatter { None => false } } - - pub fn should_render(&self) -> bool { - self.render.unwrap() - } } impl Default for SectionFrontMatter { @@ -103,15 +79,16 @@ impl Default for SectionFrontMatter { SectionFrontMatter { title: None, description: None, - sort_by: Some(SortBy::None), - weight: Some(0), + sort_by: SortBy::None, + weight: 0, template: None, paginate_by: None, - paginate_path: Some(DEFAULT_PAGINATE_PATH.to_string()), - render: Some(true), + paginate_path: DEFAULT_PAGINATE_PATH.to_string(), + render: true, redirect_to: None, - insert_anchor_links: Some(InsertAnchor::None), - extra: None, + insert_anchor_links: InsertAnchor::None, + in_search_index: true, + extra: HashMap::new(), } } } diff --git a/components/highlighting/Cargo.toml b/components/highlighting/Cargo.toml index 0f45a8eb..b2fed89a 100644 --- a/components/highlighting/Cargo.toml +++ b/components/highlighting/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "highlighting" version = "0.1.0" -authors = ["Vincent Prouillet <vincent@wearewizards.io>"] +authors = ["Vincent Prouillet <prouillet.vincent@gmail.com>"] [dependencies] lazy_static = "1" diff --git a/components/pagination/Cargo.toml b/components/pagination/Cargo.toml index 313b85ba..0ee865f8 100644 --- a/components/pagination/Cargo.toml +++ b/components/pagination/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pagination" version = "0.1.0" -authors = ["Vincent Prouillet <vincent@wearewizards.io>"] +authors = ["Vincent Prouillet <prouillet.vincent@gmail.com>"] [dependencies] tera = "0.11" diff --git a/components/pagination/src/lib.rs b/components/pagination/src/lib.rs index 2d8b2fc5..45bc3abf 100644 --- a/components/pagination/src/lib.rs +++ b/components/pagination/src/lib.rs @@ -72,13 +72,9 @@ impl<'a> Paginator<'a> { /// It will always at least create one pager (the first) even if there are no pages to paginate pub fn new(all_pages: &'a [Page], section: &'a Section) -> Paginator<'a> { let paginate_by = section.meta.paginate_by.unwrap(); - let paginate_path = match section.meta.paginate_path { - Some(ref p) => p, - None => unreachable!(), - }; - let mut pages = vec![]; let mut current_page = vec![]; + for page in all_pages { current_page.push(page); @@ -99,7 +95,7 @@ impl<'a> Paginator<'a> { continue; } - let page_path = format!("{}/{}/", paginate_path, index + 1); + let page_path = format!("{}/{}/", section.meta.paginate_path, index + 1); let permalink = format!("{}{}", section.permalink, page_path); let pager_path = if section.is_index() { page_path @@ -189,7 +185,7 @@ mod tests { fn create_section(is_index: bool) -> Section { let mut f = SectionFrontMatter::default(); f.paginate_by = Some(2); - f.paginate_path = Some("page".to_string()); + f.paginate_path = "page".to_string(); let mut s = Section::new("content/_index.md", f); if !is_index { s.path = "posts/".to_string(); diff --git a/components/rebuild/Cargo.toml b/components/rebuild/Cargo.toml index 1e001d78..a6ae5b70 100644 --- a/components/rebuild/Cargo.toml +++ b/components/rebuild/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rebuild" version = "0.1.0" -authors = ["Vincent Prouillet <vincent@wearewizards.io>"] +authors = ["Vincent Prouillet <prouillet.vincent@gmail.com>"] [dependencies] errors = { path = "../errors" } diff --git a/components/rebuild/src/lib.rs b/components/rebuild/src/lib.rs index de1d3528..fac94802 100644 --- a/components/rebuild/src/lib.rs +++ b/components/rebuild/src/lib.rs @@ -60,7 +60,7 @@ fn find_section_front_matter_changes(current: &SectionFrontMatter, new: &Section // We want to hide the section // TODO: what to do on redirect_path change? - if current.should_render() && !new.should_render() { + if current.render && !new.render { changes_needed.push(SectionChangesNeeded::Delete); // Nothing else we can do return changes_needed; @@ -383,14 +383,14 @@ mod tests { #[test] fn can_find_sort_changes_in_section_frontmatter() { - let new = SectionFrontMatter { sort_by: Some(SortBy::Date), ..SectionFrontMatter::default() }; + let new = SectionFrontMatter { sort_by: SortBy::Date, ..SectionFrontMatter::default() }; let changes = find_section_front_matter_changes(&SectionFrontMatter::default(), &new); assert_eq!(changes, vec![SectionChangesNeeded::Sort, SectionChangesNeeded::Render]); } #[test] fn can_find_render_changes_in_section_frontmatter() { - let new = SectionFrontMatter { render: Some(false), ..SectionFrontMatter::default() }; + let new = SectionFrontMatter { render: false, ..SectionFrontMatter::default() }; let changes = find_section_front_matter_changes(&SectionFrontMatter::default(), &new); assert_eq!(changes, vec![SectionChangesNeeded::Delete]); } diff --git a/components/rendering/Cargo.toml b/components/rendering/Cargo.toml index 576016fc..6a19b2dd 100644 --- a/components/rendering/Cargo.toml +++ b/components/rendering/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rendering" version = "0.1.0" -authors = ["Vincent Prouillet <vincent@wearewizards.io>"] +authors = ["Vincent Prouillet <prouillet.vincent@gmail.com>"] [dependencies] tera = "0.11" diff --git a/components/site/Cargo.toml b/components/site/Cargo.toml index 99c1abbe..55c52e61 100644 --- a/components/site/Cargo.toml +++ b/components/site/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "site" version = "0.1.0" -authors = ["Vincent Prouillet <vincent@wearewizards.io>"] +authors = ["Vincent Prouillet <prouillet.vincent@gmail.com>"] [dependencies] tera = "0.11" diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index 668bce70..1a0f6fb5 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -308,7 +308,7 @@ impl Site { /// Defaults to `AnchorInsert::None` if no parent section found pub fn find_parent_section_insert_anchor(&self, parent_path: &PathBuf) -> InsertAnchor { match self.sections.get(&parent_path.join("_index.md")) { - Some(s) => s.meta.insert_anchor_links.unwrap(), + Some(s) => s.meta.insert_anchor_links, None => InsertAnchor::None } } @@ -350,7 +350,7 @@ impl Site { .map(|p| sections[p].clone()) .collect::<Vec<_>>(); section.subsections - .sort_by(|a, b| a.meta.weight.unwrap().cmp(&b.meta.weight.unwrap())); + .sort_by(|a, b| a.meta.weight.cmp(&b.meta.weight)); } } } @@ -365,7 +365,7 @@ impl Site { } } let pages = mem::replace(&mut section.pages, vec![]); - let (sorted_pages, cannot_be_sorted_pages) = sort_pages(pages, section.meta.sort_by()); + let (sorted_pages, cannot_be_sorted_pages) = sort_pages(pages, section.meta.sort_by); section.pages = populate_previous_and_next_pages(&sorted_pages); section.ignored_pages = cannot_be_sorted_pages; } @@ -773,7 +773,7 @@ impl Site { .reduce(|| Ok(()), Result::and)?; } - if !section.meta.should_render() { + if !section.meta.render { return Ok(()); } @@ -827,13 +827,8 @@ impl Site { pub fn render_paginated(&self, output_path: &Path, section: &Section) -> Result<()> { ensure_directory_exists(&self.output_path)?; - let paginate_path = match section.meta.paginate_path { - Some(ref s) => s.clone(), - None => unreachable!() - }; - let paginator = Paginator::new(§ion.pages, section); - let folder_path = output_path.join(&paginate_path); + let folder_path = output_path.join(§ion.meta.paginate_path); create_directory(&folder_path)?; paginator diff --git a/components/taxonomies/Cargo.toml b/components/taxonomies/Cargo.toml index 1329965e..2298737d 100644 --- a/components/taxonomies/Cargo.toml +++ b/components/taxonomies/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "taxonomies" version = "0.1.0" -authors = ["Vincent Prouillet <vincent@wearewizards.io>"] +authors = ["Vincent Prouillet <prouillet.vincent@gmail.com>"] [dependencies] tera = "0.11" diff --git a/components/templates/Cargo.toml b/components/templates/Cargo.toml index f53c4183..0d6ebe8a 100644 --- a/components/templates/Cargo.toml +++ b/components/templates/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "templates" version = "0.1.0" -authors = ["Vincent Prouillet <vincent@wearewizards.io>"] +authors = ["Vincent Prouillet <prouillet.vincent@gmail.com>"] [dependencies] tera = "0.11" diff --git a/components/utils/Cargo.toml b/components/utils/Cargo.toml index 27ca4204..017a1eb7 100644 --- a/components/utils/Cargo.toml +++ b/components/utils/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "utils" version = "0.1.0" -authors = ["Vincent Prouillet <vincent@wearewizards.io>"] +authors = ["Vincent Prouillet <prouillet.vincent@gmail.com>"] [dependencies] errors = { path = "../errors" }