cartel-pg 0.23.0

Async PostgreSQL driver for the dope runtime
Documentation
mod void;

use crate::dsl::{agg, query, write};
pub(super) use void::Void;

pub trait Fetch<T>: Void {
    fn one(self) -> T {
        self.infer(())
    }

    fn first(self) -> Option<T> {
        self.infer(())
    }

    fn all(self) -> Vec<T> {
        self.infer(())
    }

    fn stream(self) -> query::Stream<T> {
        self.infer(())
    }
}

impl<T> Fetch<T> for query::Filter<T> {}
impl<T> Fetch<T> for query::Cte<T> {}
impl<T> Fetch<T> for query::Select<T> {}

pub trait Reduce<T>: Void {
    fn count(self) -> i64 {
        self.infer(())
    }

    fn sum<F, U, R>(self, map: F) -> Option<R>
    where
        F: FnOnce(T) -> U,
    {
        self.infer(map)
    }

    fn avg<F, U, R>(self, map: F) -> Option<R>
    where
        F: FnOnce(T) -> U,
    {
        self.infer(map)
    }

    fn min<F, U, R>(self, map: F) -> Option<R>
    where
        F: FnOnce(T) -> U,
    {
        self.infer(map)
    }

    fn max<F, U, R>(self, map: F) -> Option<R>
    where
        F: FnOnce(T) -> U,
    {
        self.infer(map)
    }

    fn group_by<F, K>(self, key: F) -> agg::Group<T, K>
    where
        F: FnOnce(T) -> K,
    {
        self.infer(key)
    }
}

impl<T> Reduce<T> for query::Filter<T> {}

pub trait Arrange<T>: Void {
    fn order_by<F, U>(self, key: F) -> Self
    where
        F: FnOnce(T) -> U,
    {
        self.infer(key)
    }

    fn order_desc<F, U>(self, key: F) -> Self
    where
        F: FnOnce(T) -> U,
    {
        self.infer(key)
    }

    fn limit(self, count: i64) -> Self {
        self.infer(count)
    }

    fn offset(self, count: i64) -> Self {
        self.infer(count)
    }

    fn distinct(self) -> Self {
        self.infer(())
    }

    fn distinct_on<F, U>(self, key: F) -> Self
    where
        F: FnOnce(T) -> U,
    {
        self.infer(key)
    }

    fn for_update(self) -> Self {
        self.infer(())
    }

    fn for_share(self) -> Self {
        self.infer(())
    }
}

impl<T> Arrange<T> for query::Filter<T> {}

pub trait Change<T>: Void {
    fn update<F>(self, update: F) -> write::Update<T>
    where
        F: FnOnce(&mut T),
    {
        self.infer(update)
    }

    fn delete(self) -> write::Delete<T> {
        self.infer(())
    }
}

impl<T> Change<T> for query::Filter<T> {}

pub trait Set<T>: Void {
    fn union(self, other: Self) -> Self {
        self.infer(other)
    }

    fn union_all(self, other: Self) -> Self {
        self.infer(other)
    }

    fn intersect(self, other: Self) -> Self {
        self.infer(other)
    }

    fn meet_all(self, other: Self) -> Self {
        self.infer(other)
    }

    fn except(self, other: Self) -> Self {
        self.infer(other)
    }

    fn except_all(self, other: Self) -> Self {
        self.infer(other)
    }
}

impl<T> Set<T> for query::Filter<T> {}
impl<T> Set<T> for query::Cte<T> {}

pub trait Project<T>: Void {
    fn cte(self) -> query::Cte<T> {
        self.infer(())
    }

    fn select<F, R>(self, map: F) -> query::Select<R>
    where
        F: FnOnce(T) -> R,
    {
        self.infer(map)
    }
}

impl<T> Project<T> for query::Filter<T> {}