bucketwarden-server 0.1.0

BucketWarden storage server runtime.
Documentation
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,
    ))
}