use bumpalo::Bump;
use super::writer::START_BYTES;
use super::{DecodeError, Decoder, Writer};
use crate::model::borrowed::ValueRef;
use crate::model::value::Value;
pub fn encode(value: &Value) -> Vec<u8> {
let mut out = Vec::with_capacity(START_BYTES);
encode_into(value, &mut out);
out
}
pub fn encode_into(value: &Value, out: &mut Vec<u8>) {
let mut w = Writer::appending(std::mem::take(out));
w.value(value);
*out = w.finish();
}
pub fn decode(bytes: &[u8]) -> Result<Value, DecodeError> {
let mut d = Decoder::open(bytes)?;
let v = d.value()?;
d.end()?;
Ok(v)
}
pub fn upgrade(bytes: &[u8]) -> Result<Vec<u8>, DecodeError> {
decode(bytes).map(|value| encode(&value))
}
pub fn decode_ref<'a>(bytes: &'a [u8], arena: &'a Bump) -> Result<ValueRef<'a>, DecodeError> {
let mut d = Decoder::open(bytes)?;
let v = d.value_ref(arena)?;
d.end()?;
Ok(v)
}