azure-iot-rs 0.7.2

Rust wrappers for Azure IOT C SDK
Documentation
use azure_iot_rs_sys::{IOTHUB_CLIENT_RESULT, IoTHub_Deinit, IoTHub_Init};
use std::{os::raw::c_int, sync::OnceLock};

use crate::IotError;

static IOTHUB: OnceLock<IotHub> = OnceLock::new();

pub struct IotHub(c_int);

impl IotHub {
    pub fn ensure_initialized() -> Result<(), IotError> {
        let hub = IOTHUB.get_or_init(|| {
            let result = unsafe { IoTHub_Init() };
            Self(result)
        });
        IotError::check_sdk_result(hub.0 as IOTHUB_CLIENT_RESULT)
    }
}

impl Drop for IotHub {
    fn drop(&mut self) {
        if self.0 == 0 {
            unsafe {
                IoTHub_Deinit();
            }
        }
    }
}