use crate::module::inner::ModuleInner;
use crate::{Error, Result};
const MAGIC: &[u8; 8] = b"submwc01";
const ARTIFACT_VERSION: u32 = 12;
pub(crate) fn encode(inner: &ModuleInner) -> Result<Vec<u8>> {
let mut out = Vec::new();
out.extend_from_slice(MAGIC);
out.extend_from_slice(&ARTIFACT_VERSION.to_le_bytes());
let body = postcard::to_allocvec(inner)
.map_err(|e| Error::msg(format!("failed to serialize module: {e}")))?;
out.extend_from_slice(&body);
Ok(out)
}
pub(crate) fn decode(bytes: &[u8]) -> Result<ModuleInner> {
let rest = bytes
.strip_prefix(MAGIC)
.ok_or_else(|| Error::msg("not a submilli serialized module"))?;
let (ver, body) = rest
.split_first_chunk::<4>()
.ok_or_else(|| Error::msg("truncated serialized module header"))?;
if u32::from_le_bytes(*ver) != ARTIFACT_VERSION {
return Err(Error::msg(
"incompatible serialized module (version mismatch)",
));
}
postcard::from_bytes(body).map_err(|e| Error::msg(format!("failed to deserialize module: {e}")))
}