#![cfg_attr(not(feature = "std"), no_std)]
#![forbid(unsafe_code)]
#![deny(missing_docs)]
#[cfg(feature = "alloc")]
extern crate alloc;
mod decode;
#[cfg(feature = "diagnostic")]
pub mod diagnostic;
mod encode;
mod error;
mod options;
#[cfg(feature = "parallel")]
pub mod parallel;
#[cfg(feature = "serde")]
mod serde_codec;
#[cfg(feature = "serde")]
pub mod tag;
#[cfg(feature = "alloc")]
pub mod value;
pub use decode::{Event, Parser, RawValue, SequenceDecoder, SliceDecoder};
#[cfg(feature = "alloc")]
pub use decode::{
from_slice_bool_array, from_slice_bool_array_into, from_slice_f32_array,
from_slice_f32_array_into, from_slice_f64_array, from_slice_f64_array_into,
from_slice_i8_array, from_slice_i8_array_into, from_slice_i16_array, from_slice_i16_array_into,
from_slice_i32_array, from_slice_i32_array_into, from_slice_i64_array,
from_slice_i64_array_into, from_slice_u8_array, from_slice_u8_array_into, from_slice_u16_array,
from_slice_u16_array_into, from_slice_u32_array, from_slice_u32_array_into,
from_slice_u64_array, from_slice_u64_array_into,
};
pub use encode::{Encoder, Output, SliceOutput};
pub use error::{Error, ErrorKind, Result};
pub use options::{DecodeOptions, Validation};
#[cfg(feature = "serde")]
pub use serde_codec::{
Deserializer, DeterministicScratch, EncodeConfig, Serializer, from_slice,
from_slice_with_options, serialized_size, to_slice, to_vec, to_vec_deterministic,
to_vec_deterministic_into, to_vec_deterministic_into_with_scratch, to_vec_into, to_vec_packed,
};
#[cfg(feature = "serde")]
pub use tag::Tagged;
#[cfg(feature = "serde")]
pub mod de {
pub use crate::{Deserializer, from_slice, from_slice_with_options};
#[cfg(feature = "std")]
pub use crate::{ReaderDeserializer, from_reader, from_reader_with_buffer};
}
#[cfg(feature = "serde")]
pub mod ser {
pub use crate::{EncodeConfig, Serializer, serialized_size, to_slice, to_vec, to_vec_packed};
#[cfg(feature = "std")]
pub use crate::{into_writer, to_writer};
}
#[cfg(feature = "std")]
pub struct IoWrite<W> {
inner: W,
offset: usize,
}
#[cfg(feature = "std")]
impl<W> IoWrite<W> {
pub const fn new(writer: W) -> Self {
Self {
inner: writer,
offset: 0,
}
}
pub fn into_inner(self) -> W {
self.inner
}
}
#[cfg(feature = "std")]
impl<W: std::io::Write> Output for IoWrite<W> {
fn write_all(&mut self, mut bytes: &[u8]) -> Result<()> {
use std::io::ErrorKind as IoErrorKind;
while !bytes.is_empty() {
match self.inner.write(bytes) {
Ok(0) => {
return Err(Error::from_io(
std::io::Error::from(IoErrorKind::WriteZero),
self.offset,
));
}
Ok(written) => {
self.offset += written;
bytes = &bytes[written..];
}
Err(error) if error.kind() == IoErrorKind::Interrupted => {}
Err(error) => return Err(Error::from_io(error, self.offset)),
}
}
Ok(())
}
}
#[cfg(feature = "alloc")]
pub use value::{BorrowedValue, Value};
#[cfg(all(feature = "serde", feature = "std"))]
pub fn from_reader<T: serde::de::DeserializeOwned, R: std::io::Read>(reader: R) -> Result<T> {
const INITIAL_CHUNK_SIZE: usize = 8 * 1024;
let mut buffer = alloc::vec::Vec::with_capacity(INITIAL_CHUNK_SIZE);
from_reader_with_buffer(reader, &mut buffer)
}
#[cfg(all(feature = "serde", feature = "std"))]
pub fn from_reader_with_buffer<T: serde::de::DeserializeOwned, R: std::io::Read>(
mut reader: R,
buffer: &mut alloc::vec::Vec<u8>,
) -> Result<T> {
const INITIAL_CHUNK_SIZE: usize = 8 * 1024;
use std::io::Read as _;
buffer.clear();
let result = (|| loop {
let chunk_size = buffer.len().max(INITIAL_CHUNK_SIZE);
let before = buffer.len();
(&mut reader)
.take(chunk_size as u64)
.read_to_end(buffer)
.map_err(|error| Error::from_io(error, buffer.len()))?;
if buffer.len() == before {
return from_slice(buffer);
}
match from_slice(buffer) {
Ok(value) => {
let mut trailing = [0];
let trailing_len = loop {
match reader.read(&mut trailing) {
Err(error) if error.kind() == std::io::ErrorKind::Interrupted => continue,
Err(error) => return Err(Error::from_io(error, buffer.len())),
Ok(length) => break length,
}
};
return if trailing_len == 0 {
Ok(value)
} else {
Err(Error::new(ErrorKind::TrailingData, buffer.len()))
};
}
Err(error) if error.kind() == ErrorKind::Eof => {}
Err(error) => return Err(error),
}
})();
buffer.clear();
result
}
#[cfg(all(feature = "serde", feature = "std"))]
pub struct ReaderDeserializer<R> {
reader: R,
buffer: alloc::vec::Vec<u8>,
start: usize,
offset: usize,
eof: bool,
options: DecodeOptions,
}
#[cfg(all(feature = "serde", feature = "std"))]
impl<R: std::io::Read> ReaderDeserializer<R> {
pub fn new(reader: R) -> Self {
Self::with_options(reader, DecodeOptions::default())
}
pub fn with_options(reader: R, options: DecodeOptions) -> Self {
Self {
reader,
buffer: alloc::vec::Vec::new(),
start: 0,
offset: 0,
eof: false,
options,
}
}
pub const fn byte_offset(&self) -> usize {
self.offset
}
pub fn into_inner(self) -> R {
self.reader
}
pub fn deserialize_next<T: serde::de::DeserializeOwned>(&mut self) -> Result<Option<T>> {
loop {
if self.start < self.buffer.len() {
let mut deserializer =
Deserializer::from_slice_with_options(&self.buffer[self.start..], self.options);
match T::deserialize(&mut deserializer) {
Ok(value) => {
let consumed = deserializer.byte_offset();
self.start += consumed;
self.offset += consumed;
if self.start == self.buffer.len() {
self.buffer.clear();
self.start = 0;
}
return Ok(Some(value));
}
Err(error) if error.kind() == ErrorKind::Eof && !self.eof => {}
Err(error) => {
return Err(Error::new(error.kind(), self.offset + error.offset()));
}
}
} else if self.eof {
return Ok(None);
}
if self.start != 0 {
self.buffer.copy_within(self.start.., 0);
self.buffer.truncate(self.buffer.len() - self.start);
self.start = 0;
}
let before = self.buffer.len();
self.buffer.resize(before + 8 * 1024, 0);
let read = loop {
match self.reader.read(&mut self.buffer[before..]) {
Err(error) if error.kind() == std::io::ErrorKind::Interrupted => continue,
Err(error) => {
self.buffer.truncate(before);
return Err(Error::from_io(error, self.offset + before));
}
Ok(read) => break read,
}
};
self.buffer.truncate(before + read);
self.eof = read == 0;
}
}
}
#[cfg(all(feature = "serde", feature = "std"))]
pub fn to_writer<T: serde::Serialize + ?Sized, W: std::io::Write>(
mut writer: W,
value: &T,
) -> Result<()> {
serde_codec::to_writer_impl(&mut writer, value)
}
#[cfg(all(feature = "serde", feature = "std"))]
pub fn into_writer<T: serde::Serialize + ?Sized, W: std::io::Write>(
value: &T,
writer: W,
) -> Result<()> {
to_writer(writer, value)
}
pub fn write_self_describe<O: Output>(output: &mut O) -> Result<()> {
let mut encoder = Encoder::new(output);
encoder.tag(55_799)
}
pub fn validate(input: &[u8]) -> Result<()> {
let mut decoder = SliceDecoder::new(input);
decoder.skip()?;
decoder.finish()
}
pub fn validate_deterministic(input: &[u8]) -> Result<()> {
let options = DecodeOptions {
validation: Validation::Deterministic,
..DecodeOptions::default()
};
let mut decoder = SliceDecoder::with_options(input, options);
decoder.skip()?;
decoder.finish()
}
#[cfg(feature = "alloc")]
pub fn from_slice_value(input: &[u8]) -> Result<Value> {
decode::decode_owned_value(input)
}
#[cfg(feature = "alloc")]
pub fn to_vec_value(value: &Value) -> Result<alloc::vec::Vec<u8>> {
let mut out = alloc::vec::Vec::new();
value.encode(&mut Encoder::new(&mut out))?;
Ok(out)
}