use std::marker::PhantomData;
use crate::{Query, QueryOf, TypeCast, expression::Expression, lower::LowerCtx, ty::TypeMeta};
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,
{
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)
}
}