use anyhow::Result;
use crate::exec::function::FunctionRegistry;
use crate::exec::physical_expr::EvalContext;
use crate::val::Value;
use crate::{define_async_function, register_functions};
async fn sleep_impl(ctx: &EvalContext<'_>, args: Vec<Value>) -> Result<Value> {
let duration = match args.into_iter().next() {
Some(Value::Duration(d)) => d,
Some(v) => {
return Err(anyhow::anyhow!(
"Function 'sleep' expects a duration argument, got: {}",
v.kind_of()
));
}
None => return Err(anyhow::anyhow!("Function 'sleep' expects a duration argument")),
};
let cancellation = ctx.exec_ctx.cancellation();
tokio::select! {
_ = tokio::time::sleep(duration.0) => Ok(Value::None),
_ = cancellation.cancelled() => {
Ok(Value::None)
}
}
}
define_async_function!(Sleep, "sleep", (duration: Duration) -> None, sleep_impl);
pub fn register(registry: &mut FunctionRegistry) {
register_functions!(registry, Sleep,);
}