Skip to content

Commit

Permalink
Add array-pagination fn to Paginated.
Browse files Browse the repository at this point in the history
  • Loading branch information
bobmcwhirter committed Sep 6, 2024
1 parent 72aca16 commit e257a56
Showing 1 changed file with 73 additions and 0 deletions.
73 changes: 73 additions & 0 deletions common/src/model.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
mod bytesize;

pub use bytesize::*;
use std::cmp::min;

use crate::db::limiter::Limiter;
use sea_orm::{ConnectionTrait, DbErr, SelectorTrait};
Expand Down Expand Up @@ -73,6 +74,32 @@ pub struct Paginated {
pub limit: u64,
}

impl Paginated {
pub fn paginate_array<T: Clone>(&self, vec: &[T]) -> PaginatedResults<T> {
// trying to start past the end of the vec
if self.offset as usize > vec.len() {
return PaginatedResults {
items: vec![],
total: vec.len() as u64,
};
}

if self.limit == 0 {
return PaginatedResults {
items: Vec::from(&vec[self.offset as usize..]),
total: vec.len() as u64,
};
}

let end = min(self.offset as usize + self.limit as usize, vec.len());

PaginatedResults {
items: Vec::from(&vec[self.offset as usize..end]),
total: vec.len() as u64,
}
}
}

mod default {
pub(super) const fn limit() -> u64 {
25
Expand Down Expand Up @@ -132,3 +159,49 @@ macro_rules! paginated {
});
};
}

#[cfg(test)]
mod test {
use crate::model::Paginated;

#[test_log::test(test)]
fn paginated_vec() {
let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

let paginated = Paginated {
offset: 0,
limit: 0,
}
.paginate_array(&data);

assert_eq!(10, paginated.total);
assert_eq!(10, paginated.items.len());

let paginated = Paginated {
offset: 0,
limit: 5,
}
.paginate_array(&data);

assert_eq!(10, paginated.total);
assert_eq!(5, paginated.items.len());

let paginated = Paginated {
offset: 5,
limit: 0,
}
.paginate_array(&data);

assert_eq!(10, paginated.total);
assert_eq!(5, paginated.items.len());

let paginated = Paginated {
offset: 12,
limit: 0,
}
.paginate_array(&data);

assert_eq!(10, paginated.total);
assert_eq!(0, paginated.items.len());
}
}

0 comments on commit e257a56

Please sign in to comment.