1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use std::ops::Index;
#[derive(Clone, Debug)]
#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
pub struct Page<T> {
records: Vec<T>,
total: u64,
}
impl<T> Page<T> {
pub fn new(records: Vec<T>, total: u64) -> Page<T> {
Page { records, total }
}
pub fn total(&self) -> u64 {
self.total
}
pub fn size(&self) -> u32 {
self.records.len() as u32
}
pub fn records(&self) -> &Vec<T> {
&self.records
}
}
impl<T> IntoIterator for Page<T> {
type Item = T;
type IntoIter = std::vec::IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
self.records.into_iter()
}
}
impl<T> Index<u32> for Page<T> {
type Output = T;
fn index(&self, index: u32) -> &T {
&self.records[index as usize]
}
}
#[cfg(test)]
mod tests {
use super::Page;
#[cfg(feature = "with-serde")]
use serde_json::to_string;
#[test]
fn test_page() {
let page = Page::new(vec![10, 20, 30, 40, 50, 60], 10);
assert_eq!(page.size(), 6);
assert_eq!(page.total(), 10);
assert_eq!(page[5], 60);
assert_eq!(page[2], 30);
}
#[test]
#[cfg(feature = "with-serde")]
fn test_serial_to_json(){
let page = Page::new(vec![10, 20, 30, 40, 50, 60], 10);
let json = to_string(&page);
assert!(json.is_ok());
}
}