framework-cqrs-lib 0.5.4

handle state-machine with data persist in journal and store mongo for restfull actix api
Documentation
use async_trait::async_trait;

use crate::cqrs::core::repositories::can_fetch_all::CanFetchAll;
use crate::cqrs::core::repositories::query::{InfoPaged, Page, Paged, Query};
use crate::cqrs::models::errors::ResultErr;

pub mod query;
pub mod can_fetch_all;
pub mod filter;
pub mod entities;
pub mod events;

#[async_trait]
pub trait CanFetchMany<ENTITY: Clone>: CanFetchAll<ENTITY> {
    async fn fetch_many(&self, query: Query) -> ResultErr<Paged<ENTITY>> {
        let entities = self.fetch_all(query.clone()).await?;
        let total_records = entities.len();
        let start = query.pagination.page_number * query.pagination.page_size;
        let end = start.clone() + query.pagination.page_size;
        let max_page = f64::ceil(entities.len() as f64 / query.pagination.page_size as f64) as usize;

        let paged_entities = if entities.is_empty() {
            vec![]
        } else {
            if start > entities.len() {
                vec![]
            } else {
                let sanitize_end = if end > total_records {
                    total_records
                } else {
                    end
                };
                entities.clone().iter().as_slice()[start..sanitize_end].to_vec()
            }
        };

        Ok(
            Paged {
                data: paged_entities,
                meta: InfoPaged {
                    total_pages: max_page,
                    total_records,
                    page: Page {
                        number: query.pagination.page_number,
                        size: query.pagination.page_size,
                    },
                },
            }
        )
    }
}