mockgres 0.0.27

An in-memory database that replicates a reasonable subset of Postgres functionality to make unit tests that rely on a database to run.
Documentation
use crate::engine::Plan;

#[derive(Clone, Debug)]
pub enum StatementPlan {
    Single(Box<Plan>),
    Batch(Vec<Plan>),
}

impl StatementPlan {
    pub fn from_plans(plans: Vec<Plan>) -> Self {
        if plans.len() == 1 {
            Self::Single(Box::new(plans.into_iter().next().expect("single plan")))
        } else {
            Self::Batch(plans)
        }
    }

    pub fn first_non_empty(&self) -> Option<&Plan> {
        match self {
            Self::Single(plan) => (!matches!(plan.as_ref(), Plan::Empty)).then_some(plan.as_ref()),
            Self::Batch(plans) => plans.iter().find(|plan| !matches!(plan, Plan::Empty)),
        }
    }

    pub fn is_empty(&self) -> bool {
        self.first_non_empty().is_none()
    }

    pub fn single_non_empty(&self) -> Option<&Plan> {
        match self {
            Self::Single(plan) => (!matches!(plan.as_ref(), Plan::Empty)).then_some(plan.as_ref()),
            Self::Batch(plans) => {
                let mut non_empty = plans.iter().filter(|plan| !matches!(plan, Plan::Empty));
                let first = non_empty.next()?;
                if non_empty.next().is_some() {
                    return None;
                }
                Some(first)
            }
        }
    }

    pub fn is_multi_non_empty(&self) -> bool {
        match self {
            Self::Single(_) => false,
            Self::Batch(plans) => {
                plans
                    .iter()
                    .filter(|plan| !matches!(plan, Plan::Empty))
                    .take(2)
                    .count()
                    > 1
            }
        }
    }
}