use salvo::oapi::ToSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone, Default, ToSchema)]
pub struct Sort {
pub empty: bool,
pub sorted: bool,
pub unsorted: bool,
}
impl Sort {
pub fn unsorted() -> Self {
Self {
empty: true,
sorted: false,
unsorted: true,
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone, Default, ToSchema)]
#[serde(rename_all = "camelCase")]
pub struct Pageable {
pub page_number: i64,
pub page_size: i64,
pub sort: Sort,
pub offset: i64,
pub paged: bool,
pub unpaged: bool,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default, ToSchema)]
#[serde(rename_all = "camelCase")]
pub struct SpringPage<T: ToSchema> {
pub content: Vec<T>,
pub pageable: Pageable,
pub last: bool,
pub total_pages: i64,
pub total_elements: i64,
pub first: bool,
pub size: i64,
pub number: i64,
pub sort: Sort,
pub number_of_elements: i64,
pub empty: bool,
}
impl<T: ToSchema> SpringPage<T> {
pub fn from_rbatis_page<E: Send + Sync>(
page: rbatis::plugin::page::Page<E>,
convert: impl Fn(E) -> T,
) -> Self {
let page_no = page.page_no as i64;
let page_size = page.page_size as i64;
let total = page.total as i64;
let total_pages = if page_size > 0 {
(total + page_size - 1) / page_size
} else {
0
};
let number = page_no - 1; let content: Vec<T> = page.records.into_iter().map(convert).collect();
let number_of_elements = content.len() as i64;
let sort = Sort::unsorted();
SpringPage {
content,
pageable: Pageable {
page_number: number,
page_size,
sort: sort.clone(),
offset: number * page_size,
paged: true,
unpaged: false,
},
last: number >= total_pages - 1,
total_pages,
total_elements: total,
first: number == 0,
size: page_size,
number,
sort,
number_of_elements,
empty: number_of_elements == 0,
}
}
}
impl<T: ToSchema + Send + Sync> From<rbatis::plugin::page::Page<T>> for SpringPage<T> {
fn from(p: rbatis::plugin::page::Page<T>) -> Self {
Self::from_rbatis_page(p, |e| e)
}
}