use crate::cast::*;
use core::ffi::c_void;
#[cfg(feature = "ffi_ts")]
use wasm_bindgen::prelude::*;
pub type EncodeFn<T> = extern "C" fn(*mut u8, u32, &T) -> i32;
pub type EncodeFnErased = extern "C" fn(*mut u8, u32, &c_void) -> i32;
pub type EncodeArrayFn<T> = extern "C" fn(*mut u8, u32, &T, u32) -> i32;
pub type EncodeArrayFnErased = extern "C" fn(*mut u8, u32, &c_void, u32) -> i32;
pub type DecodeFn<T> = extern "C" fn(&mut T, *const u8, u32) -> i32;
pub type DecodeFnErased = extern "C" fn(&mut c_void, *const u8, u32) -> i32;
pub type DecodeArrayFn<T> = extern "C" fn(&mut T, u32, *const u8, u32) -> i32;
pub type DecodeArrayFnErased = extern "C" fn(&mut c_void, u32, *const u8, u32) -> i32;
pub type LenFn<T> = extern "C" fn(&T) -> u32;
pub type LenFnErased = extern "C" fn(&c_void) -> u32;
pub type ArrayLenFn<T> = extern "C" fn(&T, u32) -> u32;
pub type ArrayLenFnErased = extern "C" fn(&c_void, u32) -> u32;
pub struct SeedleVTableEntry {
pub encode: EncodeFnErased,
pub encode_array: EncodeArrayFnErased,
pub decode: DecodeFnErased,
pub decode_array: DecodeArrayFnErased,
pub len: LenFnErased,
pub array_len: ArrayLenFnErased,
}
pub fn cbor_dec_slice<D>(
mut dst: *mut core::ffi::c_void,
dstlen: u32,
src: *const u8,
srclen: u32,
) -> Result<i32, minicbor::decode::Error>
where
D: minicbor::CborLen<()> + for<'b> minicbor::Decode<'b, ()>,
{
let slice = unsafe { core::slice::from_raw_parts(src, srclen as usize) };
let mut decoder = minicbor::Decoder::new(slice);
let _len = decoder
.probe()
.array()?
.ok_or_else(|| minicbor::decode::Error::message("expected fixed length array!"))?;
let mut i = 0;
for decoded in decoder.array_iter::<D>()? {
if i == dstlen {
break;
}
unsafe {
*(dst as *mut D) = decoded?;
dst = dst.add(core::mem::size_of::<D>());
}
i = i + 1;
}
Ok(decoder.position() as i32)
}