wacore_binary/
marshal.rs

1use std::io::Write;
2
3use crate::{BinaryError, Node, NodeRef, Result, decoder::Decoder, encoder::Encoder};
4
5pub fn unmarshal_ref(data: &[u8]) -> Result<NodeRef<'_>> {
6    let mut decoder = Decoder::new(data);
7    let node = decoder.read_node_ref()?;
8
9    if decoder.is_finished() {
10        Ok(node)
11    } else {
12        Err(BinaryError::LeftoverData(decoder.bytes_left()))
13    }
14}
15
16pub fn marshal_to(node: &Node, writer: &mut impl Write) -> Result<()> {
17    let mut encoder = Encoder::new(writer)?;
18    encoder.write_node(node)?;
19    Ok(())
20}
21
22pub fn marshal(node: &Node) -> Result<Vec<u8>> {
23    let mut payload = Vec::with_capacity(1024);
24    marshal_to(node, &mut payload)?;
25    Ok(payload)
26}
27
28/// Zero-copy serialization of a `NodeRef` directly into a writer.
29/// This avoids the allocation overhead of converting to an owned `Node` first.
30pub fn marshal_ref_to(node: &NodeRef<'_>, writer: &mut impl Write) -> Result<()> {
31    let mut encoder = Encoder::new(writer)?;
32    encoder.write_node_ref(node)?;
33    Ok(())
34}
35
36/// Zero-copy serialization of a `NodeRef` to a new `Vec<u8>`.
37/// Prefer `marshal_ref_to` with a reusable buffer for best performance.
38pub fn marshal_ref(node: &NodeRef<'_>) -> Result<Vec<u8>> {
39    let mut payload = Vec::with_capacity(1024);
40    marshal_ref_to(node, &mut payload)?;
41    Ok(payload)
42}