worktable 0.9.0-alpha9

WorkTable is in-memory storage
Documentation
use crate::WorkTableError;
use crate::select::{Order, QueryParams};

use std::collections::VecDeque;

pub struct SelectQueryBuilder<Row, I, ColumnRange, RowFields>
where
    I: DoubleEndedIterator<Item = Row> + Sized,
{
    pub params: QueryParams<ColumnRange, RowFields>,
    pub iter: I,
}

impl<Row, I, ColumnRange, RowFields> SelectQueryBuilder<Row, I, ColumnRange, RowFields>
where
    I: DoubleEndedIterator<Item = Row> + Sized,
{
    pub fn new(iter: I) -> Self {
        Self {
            params: QueryParams {
                limit: None,
                offset: None,
                order: VecDeque::new(),
                range: VecDeque::new(),
            },
            iter,
        }
    }

    pub fn limit(mut self, limit: usize) -> Self {
        self.params.limit = Some(limit);
        self
    }

    pub fn offset(mut self, offset: usize) -> Self {
        self.params.offset = Some(offset);
        self
    }

    pub fn order_on(mut self, column: RowFields, order: Order) -> Self {
        self.params.order.push_back((order, column));
        self
    }

    pub fn range_on<R>(mut self, column: RowFields, range: R) -> Self
    where
        R: Into<ColumnRange>,
    {
        self.params.range.push_back((range.into(), column));
        self
    }
}

pub trait SelectQueryExecutor<Row, I, ColumnRange, RowFields>
where
    Self: Sized,
    I: DoubleEndedIterator<Item = Row> + Sized,
{
    fn execute(self) -> Result<Vec<Row>, WorkTableError>;
    fn where_by<F>(
        self,
        predicate: F,
    ) -> SelectQueryBuilder<Row, impl DoubleEndedIterator<Item = Row> + Sized, ColumnRange, RowFields>
    where
        F: FnMut(&Row) -> bool;
}