#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(not(feature = "std"))]
use alloc::{fmt, format, string::ToString, vec::Vec};
#[cfg(not(feature = "std"))]
extern crate alloc;
#[cfg(feature = "std")]
use std::fmt;
mod tag;
pub use tag::*;
mod byte_counter;
#[cfg(all(feature = "std", feature = "cbor_value_encoding_fix"))]
pub mod cbor_value_encoding_fix;
mod error;
mod walker;
pub use ciborium::{cbor, value::Value};
use ciborium::{de::from_reader, ser::into_writer};
pub use ciborium_io::{Read, Write};
pub use error::BorError;
pub use serde::{self, Deserialize, Serialize, de::DeserializeOwned};
pub use walker::*;
pub use crate::byte_counter::ByteCounter;
#[cfg(feature = "std")]
pub fn encode_into_writer<T, W>(val: &T, writer: &mut W) -> Result<(), BorError>
where
T: Serialize + ?Sized,
W: std::io::Write,
{
into_writer(&val, writer).map_err(to_bor_error)
}
#[cfg(not(feature = "std"))]
pub fn encode_into_writer<T, W>(val: &T, writer: W) -> Result<(), BorError>
where
T: Serialize + ?Sized,
W: Write,
W::Error: fmt::Debug,
{
into_writer(&val, writer).map_err(to_bor_error)
}
pub fn encode<T: Serialize + ?Sized>(val: &T) -> Result<Vec<u8>, BorError> {
let len = encoded_len(val)?;
let mut buf = Vec::with_capacity(len);
encode_into_writer(val, &mut buf)?;
Ok(buf)
}
pub fn encoded_len<T: Serialize + ?Sized>(val: &T) -> Result<usize, BorError> {
let mut counter = ByteCounter::new();
encode_into_writer(val, &mut counter)?;
Ok(counter.get())
}
pub fn encoded_len_with_limit<T: Serialize + ?Sized>(val: &T, limit: usize) -> Result<usize, BorError> {
let mut counter = ByteCounter::with_limit(limit);
encode_into_writer(val, &mut counter)?;
Ok(counter.get())
}
pub fn to_value<T: Serialize + ?Sized>(val: &T) -> Result<Value, BorError> {
Value::serialized(val).map_err(to_bor_error)
}
pub fn from_value<T: DeserializeOwned>(val: &Value) -> Result<T, BorError> {
Value::deserialized(val).map_err(to_bor_error)
}
pub fn decode<T: DeserializeOwned>(mut input: &[u8]) -> Result<T, BorError> {
decode_inner(&mut input)
}
fn decode_inner<T: DeserializeOwned>(input: &mut &[u8]) -> Result<T, BorError> {
let result = from_reader(input).map_err(to_bor_error)?;
Ok(result)
}
pub fn decode_from_reader<T, R>(reader: R) -> Result<T, BorError>
where
T: DeserializeOwned,
R: Read,
R::Error: fmt::Debug,
{
let result = from_reader(reader).map_err(to_bor_error)?;
Ok(result)
}
pub fn decode_exact<T: DeserializeOwned>(mut input: &[u8]) -> Result<T, BorError> {
let val = decode_inner(&mut input)?;
if !input.is_empty() {
return Err(BorError::new(format!(
"decode_exact: {} bytes remaining on input",
input.len()
)));
}
Ok(val)
}
fn to_bor_error<E>(e: E) -> BorError
where E: fmt::Display {
BorError::new(e.to_string())
}