mod any;
mod general;
mod item;
mod nb;
mod rich;
#[doc(hidden)]
pub use any::*;
#[doc(hidden)]
pub use general::*;
#[doc(hidden)]
pub use item::skip_field;
#[doc(hidden)]
pub use nb::*;
#[doc(hidden)]
pub use rich::*;
use crate::{DeclProvider, Value, encoding::item::decode_item};
pub fn encode(value: &Value) -> Vec<u8> {
let mut data = vec![0];
encode_any(&mut data, value);
data
}
pub fn decode(data: &[u8], provider: &dyn DeclProvider) -> Option<Value> {
let mut ind = 0;
let decl_path = decode_str(data, &mut ind)?;
let value = if decl_path.is_empty() {
decode_any(data, &mut ind)?
} else {
let rootid = decode_vuint(data, &mut ind)? as u16;
let item = provider.load(&decl_path).ok()?.get_by_id(rootid)?;
decode_item(data, &mut ind, item, provider)?
};
if ind != data.len() {
return None;
}
Some(value)
}
pub trait Serialized
where
Self: Sized,
{
fn encode(&self) -> Vec<u8>;
fn encode_inline(&self, data: &mut Vec<u8>);
fn decode(data: &[u8]) -> Option<Self>;
fn decode_headless(data: &[u8]) -> Option<Self>;
fn decode_inline(data: &[u8], ind: &mut usize) -> Option<Self>;
}