use anyhow::bail;
use reblessive::tree::Stk;
use surrealdb_strand::Strand;
use crate::ctx::FrozenContext;
use crate::dbs::Options;
use crate::exe::FlowResultExt as _;
use crate::exec::Error as ExecError;
use crate::expr::convert::analyzer_function::function_from_storage;
use crate::idx::ft::analyzer::{AnalyzerFunction, BoxAnalyzerFut};
use crate::legacy::function_compute;
use crate::sql::analyzer_function::qualified_name;
use crate::val::Value;
pub(crate) struct LegacyAnalyzerFunction<'a> {
ctx: &'a FrozenContext,
opt: &'a Options,
}
impl<'a> LegacyAnalyzerFunction<'a> {
pub(crate) fn new(ctx: &'a FrozenContext, opt: &'a Options) -> Self {
Self {
ctx,
opt,
}
}
}
impl AnalyzerFunction for LegacyAnalyzerFunction<'_> {
fn call<'a>(&'a self, stk: &'a mut Stk, name: &'a str, input: Strand) -> BoxAnalyzerFut<'a> {
Box::pin(async move {
let val = function_compute(
&function_from_storage(name),
stk,
self.ctx,
self.opt,
None,
vec![Value::String(input)],
)
.await
.catch_return()?;
if let Value::String(val) = val {
Ok(val)
} else {
bail!(ExecError::InvalidFunction {
name: qualified_name(name),
message: "The function should return a string.".to_string(),
});
}
})
}
}