use std::fmt::Debug;
use anyhow::Result;
use super::Signature;
use crate::exec::physical_expr::EvalContext;
use crate::exec::{BoxFut, ContextLevel, SendSyncRequirement};
use crate::expr::Kind;
use crate::expr::idiom::Idiom;
use crate::val::Value;
pub trait ProjectionFunction: SendSyncRequirement + Debug {
fn name(&self) -> &'static str;
#[allow(unused)]
fn signature(&self) -> Signature;
#[allow(unused)]
fn return_type(&self, _arg_types: &[Kind]) -> Result<Kind> {
Ok(self.signature().returns)
}
fn required_context(&self) -> ContextLevel {
ContextLevel::Database
}
#[allow(clippy::type_complexity)]
fn invoke_async<'a>(
&'a self,
ctx: &'a EvalContext<'_>,
args: Vec<Value>,
) -> BoxFut<'a, Result<Vec<(Idiom, Value)>>>;
}