use datafusion::logical_expr::lit;
use datafusion_functions::core::expr_fn as core_fn;
use hamelin_lib::func::defs::{ParseJsonString, ParseJsonVariant, ToJsonString, Typeof};
use super::DataFusionTranslationRegistry;
use crate::struct_expansion::hamelin_type_to_arrow;
pub fn register(registry: &mut DataFusionTranslationRegistry) {
registry.register::<ParseJsonString>(|mut params| {
let json_string = params.take()?.expr;
Ok(crate::udf::json_to_variant_udf().call(vec![json_string]))
});
registry.register::<ParseJsonVariant>(|mut params| {
let variant = params.take()?.expr;
Ok(variant)
});
registry.register::<ToJsonString>(|mut params| {
let value = params.take()?.expr;
Ok(crate::udf::variant_to_json_udf().call(vec![value]))
});
registry.register::<Typeof>(|mut params| {
let x = params.take()?;
let hamelin_type = x.typ.as_ref();
let hamelin_type_str = hamelin_type.to_string();
let arrow_type = hamelin_type_to_arrow(hamelin_type);
let sql_type_str = format!("{}", arrow_type);
Ok(core_fn::named_struct(vec![
lit("hamelin_type"),
lit(hamelin_type_str),
lit("sql_type"),
lit(sql_type_str),
]))
});
}