cobalt/cobalt_model/
pagination.rs

1use std::vec::Vec;
2
3use cobalt_config::SortOrder;
4
5pub use cobalt_config::DateIndex;
6pub use cobalt_config::Include;
7
8#[derive(Clone, Debug, serde::Serialize, PartialEq, Eq)]
9#[serde(deny_unknown_fields, default)]
10pub struct PaginationConfig {
11    pub include: Include,
12    pub per_page: i32,
13    pub front_permalink: cobalt_config::Permalink,
14    pub permalink_suffix: liquid::model::KString,
15    pub order: SortOrder,
16    pub sort_by: Vec<liquid::model::KString>,
17    pub date_index: Vec<DateIndex>,
18}
19
20impl PaginationConfig {
21    pub fn from_config(
22        config: cobalt_config::Pagination,
23        permalink: &cobalt_config::Permalink,
24    ) -> Option<Self> {
25        let config = config.merge(&cobalt_config::Pagination::with_defaults());
26        let cobalt_config::Pagination {
27            include,
28            per_page,
29            permalink_suffix,
30            order,
31            sort_by,
32            date_index,
33        } = config;
34        let include = include.expect("default applied");
35        let per_page = per_page.expect("default applied");
36        let permalink_suffix = permalink_suffix.expect("default applied");
37        let order = order.expect("default applied");
38        let sort_by = sort_by.expect("default applied");
39        let date_index = date_index.expect("default applied");
40
41        if include == Include::None {
42            return None;
43        }
44        Some(Self {
45            include,
46            per_page,
47            front_permalink: permalink.to_owned(),
48            permalink_suffix,
49            order,
50            sort_by,
51            date_index,
52        })
53    }
54}
55
56// TODO to be replaced by a call to `is_sorted()` once it's stabilized
57pub fn is_date_index_sorted(v: &[DateIndex]) -> bool {
58    let mut copy = v.to_owned();
59    copy.sort_unstable();
60    copy.eq(v)
61}