use super::*;
pub(crate) const DEFAULT_LIMIT: usize = 100;
pub(crate) const MAX_LIMIT: usize = 1000;
pub(crate) fn validated_limit_offset(
limit: Option<usize>,
offset: Option<usize>,
) -> Result<(usize, usize), RuntimeError> {
let limit = limit.unwrap_or(DEFAULT_LIMIT);
let offset = offset.unwrap_or_default();
if limit == 0 || limit > MAX_LIMIT {
return Err(RuntimeError::InvalidListParameter {
name: "limit".to_string(),
value: limit.to_string(),
});
}
Ok((limit, offset))
}
pub(crate) fn matches_text(values: &[&str], needle: &Option<String>) -> bool {
let Some(needle) = needle.as_ref().map(|value| value.to_ascii_lowercase()) else {
return true;
};
values
.iter()
.any(|value| value.to_ascii_lowercase().contains(&needle))
}
pub(crate) fn page_vec<T>(
values: Vec<T>,
query: &ConsoleApiListQuery,
default_sort: &str,
) -> Result<(ConsoleApiPage, Vec<T>), RuntimeError> {
let (limit, offset) = validated_limit_offset(query.limit, query.offset)?;
let total = values.len();
let rows = values
.into_iter()
.skip(offset)
.take(limit)
.collect::<Vec<_>>();
Ok((
ConsoleApiPage {
limit,
offset,
total,
returned: rows.len(),
sort: query
.sort
.clone()
.unwrap_or_else(|| default_sort.to_string()),
},
rows,
))
}