ljm/
util.rs

1use std::{ffi::CString, os::raw::c_int};
2
3use crate::{DataType, Error, Register};
4
5pub(crate) fn check_ret<T>(ret: c_int, out: T) -> Result<T, Error> {
6    if ret == 0 {
7        Ok(out)
8    } else {
9        Err(ret.into())
10    }
11}
12
13/// Takes a Modbus register name as input and produces the corresponding Modbus register.
14///
15/// Returns None if LJM is not able to identify the register.
16/// See it in the [LJM User Guide](https://support.labjack.com/docs/nametoaddress-ljm-user-s-guide).
17pub fn name_to_reg(name: &CString) -> Result<Option<Register>, Error> {
18    let mut address: c_int = -1;
19    let mut data_type: c_int = ffi::LJM_INVALID_NAME_ADDRESS;
20    unsafe {
21        let ret = ffi::LJM_NameToAddress(name.as_ptr(), &mut address, &mut data_type);
22        let reg = DataType::try_from(data_type)
23            .ok()
24            .map(|data_type| Register { address, data_type });
25        check_ret(ret, reg)
26    }
27}