xidl-xcdr 0.2.0

A IDL codegen.
Documentation
use crate::XcdrSerializer;
use crate::{
    ffi::{XcdrFfiError, macros::impl_ffi_serialize_for},
    plain_cdr2::PlainCdr2Serialize,
};

pub type FfiPlainCdr2Serializer = PlainCdr2Serialize;

impl FfiPlainCdr2Serializer {
    #[unsafe(no_mangle)]
    pub extern "C" fn plain_cdr2_serializer_new(buf_ptr: *mut u8, buf_len: usize) -> Self {
        let do_io = !(buf_ptr.is_null() || buf_len == 0);
        Self {
            buf: buf_ptr,
            len: buf_len,
            pos: 0,
            do_io,
        }
    }

    #[unsafe(no_mangle)]
    pub extern "C" fn plain_cdr2_serializer_position(&self) -> usize {
        self.pos
    }

    #[unsafe(no_mangle)]
    pub extern "C" fn plain_cdr2_serializer_reset(&mut self) {
        self.pos = 0;
    }
}

impl_ffi_serialize_for!(
    plain_cdr2_serializer,
    FfiPlainCdr2Serializer,
    with_serializer
);

fn with_serializer<R>(
    self_: &mut FfiPlainCdr2Serializer,
    f: impl FnOnce(&mut PlainCdr2Serialize) -> crate::error::XcdrResult<R>,
) -> Result<R, XcdrFfiError> {
    let out = f(self_)?;
    Ok(out)
}