#[derive(Debug, Clone, Default, PartialEq)]
pub struct Pages {
pub pages: Vec<PageEntry>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct PageEntry {
pub id: u32,
pub base_loc: String,
}
impl PageEntry {
#[must_use]
pub fn new(id: u32, base_loc: impl Into<String>) -> Self {
Self {
id,
base_loc: base_loc.into(),
}
}
}
impl Pages {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn add_page(&mut self, entry: PageEntry) {
self.pages.push(entry);
}
#[must_use]
pub fn len(&self) -> usize {
self.pages.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.pages.is_empty()
}
#[must_use]
pub fn get(&self, index: usize) -> Option<&PageEntry> {
self.pages.get(index)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn pages_new() {
let p = Pages::new();
assert!(p.is_empty());
assert_eq!(p.len(), 0);
}
#[test]
fn pages_add_page() {
let mut p = Pages::new();
p.add_page(PageEntry::new(1, "Pages/Page_0.xml"));
p.add_page(PageEntry::new(2, "Pages/Page_1.xml"));
assert_eq!(p.len(), 2);
assert!(!p.is_empty());
}
#[test]
fn pages_get() {
let mut p = Pages::new();
p.add_page(PageEntry::new(1, "Pages/Page_0.xml"));
let entry = p.get(0).unwrap();
assert_eq!(entry.id, 1);
assert_eq!(entry.base_loc, "Pages/Page_0.xml");
assert!(p.get(1).is_none());
}
#[test]
fn page_entry_new() {
let pe = PageEntry::new(5, "Pages/Page_4.xml");
assert_eq!(pe.id, 5);
assert_eq!(pe.base_loc, "Pages/Page_4.xml");
}
#[test]
fn pages_clone_debug() {
let p = Pages::new();
let p2 = p.clone();
assert!(p2.is_empty());
assert!(format!("{p:?}").contains("Pages"));
}
}