use super::sys::wire::wire::{upb_Decode, upb_Encode, DecodeStatus, EncodeStatus};
use super::{Arena, AssociatedMiniTable, MessagePtr};
pub mod decode_options {
pub const ALIAS_STRING: i32 = 1;
pub const CHECK_REQUIRED: i32 = 2;
pub const EXPERIMENTAL_ALLOW_UNLINKED: i32 = 4;
pub const ALWAYS_VALIDATE_UTF8: i32 = 8;
}
pub fn encode<T: AssociatedMiniTable>(msg: MessagePtr<T>) -> Result<Vec<u8>, EncodeStatus> {
let arena = Arena::new();
let mut buf: *mut u8 = core::ptr::null_mut();
let mut len = 0usize;
let status =
unsafe { upb_Encode(msg.raw(), T::mini_table(), 0, arena.raw(), &mut buf, &mut len) };
if status == EncodeStatus::Ok {
assert!(!buf.is_null());
Ok(unsafe { &*core::ptr::slice_from_raw_parts(buf, len) }.to_vec())
} else {
Err(status)
}
}
pub unsafe fn decode<T: AssociatedMiniTable>(
buf: &[u8],
msg: MessagePtr<T>,
arena: &Arena,
) -> Result<(), DecodeStatus> {
unsafe { decode_with_options(buf, msg, arena, decode_options::CHECK_REQUIRED) }
}
pub unsafe fn decode_with_options<T: AssociatedMiniTable>(
buf: &[u8],
msg: MessagePtr<T>,
arena: &Arena,
decode_options_bitmask: i32,
) -> Result<(), DecodeStatus> {
let len = buf.len();
let buf = buf.as_ptr();
let status = unsafe {
upb_Decode(
buf,
len,
msg.raw(),
T::mini_table(),
core::ptr::null(),
decode_options_bitmask,
arena.raw(),
)
};
match status {
DecodeStatus::Ok => Ok(()),
_ => Err(status),
}
}