use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct Page<T> {
pub items: Vec<T>,
pub offset: u64,
pub limit: u64,
}
impl<T> Page<T> {
pub fn new(items: Vec<T>, offset: u64, limit: u64) -> Self {
Self {
items,
offset,
limit,
}
}
pub fn len(&self) -> usize {
self.items.len()
}
pub fn is_empty(&self) -> bool {
self.items.is_empty()
}
pub fn is_probably_last(&self) -> bool {
(self.items.len() as u64) < self.limit
}
pub fn next_offset(&self) -> u64 {
self.offset + self.items.len() as u64
}
}
impl<T> IntoIterator for Page<T> {
type Item = T;
type IntoIter = std::vec::IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
self.items.into_iter()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn page_basics() {
let p = Page::new(vec![1, 2, 3], 0, 10);
assert_eq!(p.len(), 3);
assert!(!p.is_empty());
assert!(p.is_probably_last());
assert_eq!(p.next_offset(), 3);
}
#[test]
fn full_page_not_probably_last() {
let p = Page::new(vec![1, 2, 3], 0, 3);
assert!(!p.is_probably_last());
assert_eq!(p.next_offset(), 3);
}
#[test]
fn iter() {
let p = Page::new(vec!["a", "b"], 5, 10);
let v: Vec<_> = p.into_iter().collect();
assert_eq!(v, vec!["a", "b"]);
}
}