zbus_module 0.1.0

Zabbix loadable module for accessing data on ZBUS telemetry bus
Documentation
extern crate log;
use libc::{c_char};
use std::ffi::{CString, CStr};

use crate::zbus_zenoh;

fn get_value_v2(data: &serde_json::Value) -> Option<serde_json::Value> {
    match data.get("body") {
        Some(body) => {
            match body.get("details") {
                Some(details1) => {
                    match details1.get("details") {
                        Some(details) => {
                            match details.get("data") {
                                Some(data) => { return Some(data.clone()); }
                                None => { return None; }
                            }
                        }
                        None => { return None; }
                    }
                }
                None => { return None; }
            }
        }
        None => { return None; }
    }
}

#[no_mangle]
pub unsafe extern fn free_string(ptr: *const c_char) {
    let _ = CString::from_raw(ptr as *mut _);
}

#[no_mangle]
pub extern fn zbus_module_get_str(key: *const c_char) -> *const c_char {
    match unsafe { CStr::from_ptr(key).to_str() } {
        Ok(zbus_key) => {
            match zbus_zenoh::get(zbus_key.to_string()) {
                Some(res) => {
                    match get_value_v2(&res) {
                        Some(value) => {
                            return CString::new(value.to_string()).expect("Expecting a value").into_raw();
                        }
                        None => {
                            return std::ptr::null();
                        }
                    }
                }
                None => {
                    return std::ptr::null();
                }
            }
        }
        Err(err) => {
            log::error!("Error converting key: {:?}", err);
            return std::ptr::null();
        }
    }
}

#[no_mangle]
pub extern fn zbus_module_get_raw(key: *const c_char) -> *const c_char {
    match unsafe { CStr::from_ptr(key).to_str() } {
        Ok(zbus_key) => {
            match zbus_zenoh::get(zbus_key.to_string()) {
                Some(res) => {
                    return CString::new(res.to_string()).expect("Expecting a value").into_raw();
                }
                None => {
                    return std::ptr::null();
                }
            }
        }
        Err(err) => {
            log::error!("Error converting key: {:?}", err);
            return std::ptr::null();
        }
    }
}