#![no_std]
#![warn(missing_docs, unused_lifetimes)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![doc(html_root_url = "https://docs.rs/cu-bincode/2.2.0-beta")]
#![crate_name = "cu_bincode"]
#![crate_type = "rlib"]
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(any(feature = "std", test))]
extern crate std;
mod atomic;
mod uleb128;
pub use uleb128::Uleb128;
mod features;
pub(crate) mod utils;
pub(crate) mod varint;
use de::{Decoder, read::Reader};
use enc::write::Writer;
#[cfg(any(
feature = "alloc",
feature = "std",
feature = "derive",
feature = "serde"
))]
pub use features::*;
pub mod value_decode;
pub use value_decode::{ValueDecode, ValueDecodeSpec};
pub mod config;
#[macro_use]
pub mod de;
pub mod enc;
pub mod error;
pub use de::{BorrowDecode, Decode};
pub use enc::Encode;
use config::Config;
pub fn encode_into_slice<E: enc::Encode, C: Config>(
val: E,
dst: &mut [u8],
config: C,
) -> Result<usize, error::EncodeError> {
let writer = enc::write::SliceWriter::new(dst);
let mut encoder = enc::EncoderImpl::<_, C>::new(writer, config);
val.encode(&mut encoder)?;
Ok(encoder.into_writer().bytes_written())
}
pub fn encode_into_writer<E: enc::Encode, W: Writer, C: Config>(
val: E,
writer: W,
config: C,
) -> Result<(), error::EncodeError> {
let mut encoder = enc::EncoderImpl::<_, C>::new(writer, config);
val.encode(&mut encoder)?;
Ok(())
}
pub fn decode_from_slice<D: de::Decode<()>, C: Config>(
src: &[u8],
config: C,
) -> Result<(D, usize), error::DecodeError> {
decode_from_slice_with_context(src, config, ())
}
pub fn decode_from_slice_with_context<Context, D: de::Decode<Context>, C: Config>(
src: &[u8],
config: C,
context: Context,
) -> Result<(D, usize), error::DecodeError> {
let reader = de::read::SliceReader::new(src);
let mut decoder = de::DecoderImpl::<_, C, Context>::new(reader, config, context);
let result = D::decode(&mut decoder)?;
let bytes_read = src.len() - decoder.reader().slice.len();
Ok((result, bytes_read))
}
pub fn borrow_decode_from_slice<'a, D: de::BorrowDecode<'a, ()>, C: Config>(
src: &'a [u8],
config: C,
) -> Result<(D, usize), error::DecodeError> {
borrow_decode_from_slice_with_context(src, config, ())
}
pub fn borrow_decode_from_slice_with_context<
'a,
Context,
D: de::BorrowDecode<'a, Context>,
C: Config,
>(
src: &'a [u8],
config: C,
context: Context,
) -> Result<(D, usize), error::DecodeError> {
let reader = de::read::SliceReader::new(src);
let mut decoder = de::DecoderImpl::<_, C, Context>::new(reader, config, context);
let result = D::borrow_decode(&mut decoder)?;
let bytes_read = src.len() - decoder.reader().slice.len();
Ok((result, bytes_read))
}
pub fn decode_from_reader<D: de::Decode<()>, R: Reader, C: Config>(
reader: R,
config: C,
) -> Result<D, error::DecodeError> {
let mut decoder = de::DecoderImpl::<_, C, ()>::new(reader, config, ());
D::decode(&mut decoder)
}
#[cfg(all(feature = "alloc", feature = "derive", doc))]
pub mod spec {
#![doc = include_str!("../docs/spec.md")]
}
#[cfg(doc)]
pub mod migration_guide {
#![doc = include_str!("../docs/migration_guide.md")]
}
#[cfg(all(feature = "alloc", feature = "derive", doctest))]
mod readme {
#![doc = include_str!("../README.md")]
}