use std::cell::RefCell;
use nibli_protocol::compute_client::{BackendArg, BackendClient, BackendRequest};
use crate::{EngineComputeRequest, EngineLogicalTerm};
fn term_to_arg(term: &EngineLogicalTerm) -> BackendArg {
match term {
EngineLogicalTerm::Variable(s) => BackendArg::Variable(s.clone()),
EngineLogicalTerm::Constant(s) => BackendArg::Constant(s.clone()),
EngineLogicalTerm::Description(s) => BackendArg::Description(s.clone()),
EngineLogicalTerm::Unspecified => BackendArg::Unspecified,
EngineLogicalTerm::Number(n) => BackendArg::Number(*n),
}
}
thread_local! {
static CLIENT: RefCell<BackendClient> = const { RefCell::new(BackendClient::new()) };
}
pub(crate) fn set_addr(addr: &str) {
CLIENT.with(|c| c.borrow_mut().set_addr(addr));
}
pub(crate) fn native_eval_fn(rel: &str, args: &[EngineLogicalTerm]) -> Result<bool, String> {
let args: Vec<BackendArg> = args.iter().map(term_to_arg).collect();
CLIENT.with(|c| c.borrow_mut().dispatch(rel, &args))
}
pub(crate) fn native_batch_eval_fn(requests: &[EngineComputeRequest]) -> Vec<Result<bool, String>> {
let reqs: Vec<BackendRequest> = requests
.iter()
.map(|r| BackendRequest {
relation: r.relation.clone(),
args: r.args.iter().map(term_to_arg).collect(),
})
.collect();
CLIENT.with(|c| c.borrow_mut().dispatch_batch(&reqs))
}