razor-libnvpair 0.13.0

Low-level libnvpair interface
Documentation
use std::mem;

use libc::{c_char, c_uchar};

use super::*;

macro_rules! nvpair_value {
    ($accessor:ident, $output:ty) => {
        #[inline]
        pub unsafe fn $accessor(nvp: *mut nvpair_t) -> Result<$output, NvPairTypeMismatch> {
            let mut value = mem::MaybeUninit::uninit();
            match sys::$accessor(nvp, value.as_mut_ptr()) {
                0 => Ok(value.assume_init()),
                libc::EINVAL => Err(NvPairTypeMismatch),
                other => panic!("Impossible return value '{other}' from nvpair_value accessor"),
            }
        }
    };
}

nvpair_value!(nvpair_value_boolean_value, boolean_t);
nvpair_value!(nvpair_value_byte, c_uchar);
nvpair_value!(nvpair_value_int8, i8);
nvpair_value!(nvpair_value_uint8, u8);
nvpair_value!(nvpair_value_int16, i16);
nvpair_value!(nvpair_value_uint16, u16);
nvpair_value!(nvpair_value_int32, i32);
nvpair_value!(nvpair_value_uint32, u32);
nvpair_value!(nvpair_value_int64, i64);
nvpair_value!(nvpair_value_uint64, u64);
nvpair_value!(nvpair_value_double, f64);
nvpair_value!(nvpair_value_string, *mut c_char);
nvpair_value!(nvpair_value_nvlist, *mut nvlist_t);

macro_rules! nvpair_value_array {
    ($accessor:ident, $output:ty) => {
        #[inline]
        pub unsafe fn $accessor(nvp: *mut nvpair_t) -> Result<($output, u32), NvPairTypeMismatch> {
            let mut len = 0;
            let mut value = mem::MaybeUninit::uninit();
            match sys::$accessor(nvp, value.as_mut_ptr(), &mut len) {
                0 => Ok((value.assume_init(), len)),
                libc::EINVAL => Err(NvPairTypeMismatch),
                other => panic!("Impossible return value '{other}' from nvpair_value accessor"),
            }
        }
    };
}

nvpair_value_array!(nvpair_value_byte_array, *mut c_uchar);
nvpair_value_array!(nvpair_value_boolean_array, *mut boolean_t);
nvpair_value_array!(nvpair_value_int8_array, *mut i8);
nvpair_value_array!(nvpair_value_uint8_array, *mut u8);
nvpair_value_array!(nvpair_value_int16_array, *mut i16);
nvpair_value_array!(nvpair_value_uint16_array, *mut u16);
nvpair_value_array!(nvpair_value_int32_array, *mut i32);
nvpair_value_array!(nvpair_value_uint32_array, *mut u32);
nvpair_value_array!(nvpair_value_int64_array, *mut i64);
nvpair_value_array!(nvpair_value_uint64_array, *mut u64);
nvpair_value_array!(nvpair_value_string_array, *mut *mut c_char);
nvpair_value_array!(nvpair_value_nvlist_array, *mut *mut nvlist_t);