use std::ffi::c_void;
use std::sync::Arc;
use crate::callbacks;
use crate::error::{check, Result};
use crate::generated::{FunctionObject, Procedure};
use crate::marshal;
use crate::object::Interface;
use crate::sys;
use crate::value::{to_daq, Value};
fn encode_params(args: &[Value]) -> Result<Option<crate::object::Ref>> {
match args {
[] => Ok(None),
[single] => match single {
Value::Null => Ok(Some(crate::value::bool_to_ref(false)?)),
other => to_daq(other),
},
many => to_daq(&Value::List(many.to_vec())),
}
}
impl Procedure {
pub fn from_fn(
procedure: impl Fn(&[Value]) -> Result<()> + Send + Sync + 'static,
) -> Result<Procedure> {
let op = "daqProcedure_createProcedure";
let (trampoline, _index) = callbacks::allocate_procedure(Arc::new(procedure))?;
let mut out: *mut sys::daqProcedure = std::ptr::null_mut();
check(
unsafe { (sys::api().daqProcedure_createProcedure)(&mut out, trampoline) },
op,
)?;
unsafe { marshal::require_object::<Procedure>(out as *mut _, op) }
}
pub fn dispatch_args(&self, args: &[Value]) -> Result<()> {
let params = encode_params(args)?;
check(
unsafe {
(sys::api().daqProcedure_dispatch)(
self.as_raw() as *mut _,
crate::value::opt_ref_ptr(¶ms),
)
},
"daqProcedure_dispatch",
)
}
}
impl FunctionObject {
pub fn from_fn(
function: impl Fn(&[Value]) -> Result<Value> + Send + Sync + 'static,
) -> Result<FunctionObject> {
let op = "daqFunction_createFunction";
let (trampoline, _index) = callbacks::allocate_function(Arc::new(function))?;
let mut out: *mut sys::daqFunction = std::ptr::null_mut();
check(
unsafe { (sys::api().daqFunction_createFunction)(&mut out, trampoline) },
op,
)?;
unsafe { marshal::require_object::<FunctionObject>(out as *mut _, op) }
}
pub fn call(&self, args: &[Value]) -> Result<Value> {
let op = "daqFunction_call";
let params = encode_params(args)?;
let mut result: *mut c_void = std::ptr::null_mut();
check(
unsafe {
(sys::api().daqFunction_call)(
self.as_raw() as *mut _,
crate::value::opt_ref_ptr(¶ms),
&mut result,
)
},
op,
)?;
unsafe { crate::value::take_value(result, op) }
}
}