1use crate::ir;
11use crate::vec;
12use crate::{ArrayReader, Decode, Encode, Layout, Result};
13
14pub fn data_offset() -> usize {
15 let ty_size = ir::Ty::head_size().div_ceil(8);
16
17 let ty_defs_size = <vec::Vec<ir::TyDef> as Layout>::head_size().div_ceil(8);
18
19 ty_size + ty_defs_size
20}
21
22pub fn decode(buffer: &[u8]) -> Result<(&[u8], ir::Ty, vec::Vec<ir::TyDef>)> {
23 let ty = ir::Ty::decode(buffer)?;
24 let field_size = ir::Ty::head_size().div_ceil(8);
25 let buffer = &buffer[field_size..];
26
27 let ty_defs: vec::Vec<ir::TyDef> = Decode::decode(buffer)?;
28 let field_size = <vec::Vec<ir::TyDef> as Layout>::head_size().div_ceil(8);
29 let buffer = &buffer[field_size..];
30
31 let (offset, len) = ArrayReader::<&[u8]>::read_head(buffer);
32 let data = &buffer[offset..offset + len];
33
34 Ok((data, ty, ty_defs))
35}
36
37pub fn encode(
38 buffer: &mut bytes::BytesMut,
39 data: &[u8],
40 ty: &ir::Ty,
41 ty_defs: &[ir::TyDef],
42) -> Result<()> {
43 let ty_res = ty.encode_head(buffer);
44 let ty_defs_res = ty_defs.encode_head(buffer);
45 let data_res = data.encode_head(buffer);
46
47 ty.encode_body(ty_res, buffer);
48 ty_defs.encode_body(ty_defs_res, buffer);
49 data.encode_body(data_res, buffer);
50
51 Ok(())
52}