qraft-core 0.1.2

Core type system, query model, decoding, and SQL lowering primitives for qraft.
Documentation
//! Scalar subqueries that behave like typed expressions.

use std::marker::PhantomData;

use crate::{Query, QueryOf, TypeCast, expression::Expression, lower::LowerCtx, ty::TypeMeta};

/// A subquery expected to yield a single typed value.
pub struct Scalar<T: TypeMeta> {
    pub(crate) inner: Query,
    pub(crate) marker: PhantomData<T>,
}

impl<T> Scalar<T>
where
    T: TypeMeta + TypeCast,
    <T as TypeCast>::From: quex::FromRow,
{
    /// Converts the scalar subquery into a typed row query of the underlying Rust value.
    pub fn into_inner(self) -> QueryOf<<T as TypeCast>::From> {
        self.inner.typed()
    }
}

#[qraft_expression_macro::as_expression]
impl<T> Expression for Scalar<T>
where
    T: TypeMeta,
{
    type Type = T;

    fn lower(&self, ctx: &mut LowerCtx) -> usize {
        ctx.lower_subquery_ref(&self.inner)
    }
}