use error::Error;
use len::{Len, LenSz, StringLenSz, Sz};
use result::Result;
use std::{self, collections::BTreeMap, io::BufRead};
use types::{Special, Type};
pub trait Deserialize: Sized {
fn deserialize<R: BufRead>(reader: &mut Deserializer<R>) -> Result<Self>;
}
impl Deserialize for u8 {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
let n = raw.unsigned_integer()?;
if n > std::u8::MAX as u64 {
Err(Error::ExpectedU8)
} else {
Ok(n as Self)
}
}
}
impl Deserialize for u16 {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
let n = raw.unsigned_integer()?;
if n > std::u16::MAX as u64 {
Err(Error::ExpectedU16)
} else {
Ok(n as Self)
}
}
}
impl Deserialize for u32 {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
let n = raw.unsigned_integer()?;
if n > std::u32::MAX as u64 {
Err(Error::ExpectedU32)
} else {
Ok(n as Self)
}
}
}
impl Deserialize for u64 {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
raw.unsigned_integer()
}
}
impl Deserialize for bool {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
raw.bool()
}
}
impl Deserialize for f32 {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
raw.float().map(|f| f as f32)
}
}
impl Deserialize for f64 {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
raw.float()
}
}
impl Deserialize for String {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
raw.text()
}
}
impl<T: Deserialize> Deserialize for Vec<T> {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
let mut vec = Vec::new();
raw.array_with(|raw| {
vec.push(Deserialize::deserialize(raw)?);
Ok(())
})?;
Ok(vec)
}
}
impl<K: Deserialize + Ord, V: Deserialize> Deserialize for BTreeMap<K, V> {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
let mut vec = BTreeMap::new();
raw.map_with(|raw| {
let k = Deserialize::deserialize(raw)?;
let v = Deserialize::deserialize(raw)?;
vec.insert(k, v);
Ok(())
})?;
Ok(vec)
}
}
impl<T: Deserialize> Deserialize for Option<T> {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
match raw.array()? {
Len::Len(0) => Ok(None),
Len::Len(1) => Ok(Some(raw.deserialize()?)),
len => Err(Error::CustomError(format!(
"Invalid Option<T>: received array of {:?} elements",
len
))),
}
}
}
pub struct Deserializer<R>(R);
impl<R> From<R> for Deserializer<R> {
fn from(r: R) -> Self {
Deserializer(r)
}
}
impl<R> AsRef<R> for Deserializer<R> {
fn as_ref(&self) -> &R {
&self.0
}
}
impl<R> Deserializer<R> {
pub fn as_mut_ref(&mut self) -> &mut R {
&mut self.0
}
pub fn inner(self) -> R {
self.0
}
}
impl<R: BufRead> Deserializer<R> {
#[inline]
fn get(&mut self, index: usize) -> Result<u8> {
let buf = self.0.fill_buf()?;
match buf.get(index) {
None => Err(Error::NotEnough(buf.len(), index)),
Some(b) => Ok(*b),
}
}
#[inline]
fn u8(&mut self, index: usize) -> Result<u64> {
let b = self.get(index)?;
Ok(b as u64)
}
#[inline]
fn u16(&mut self, index: usize) -> Result<u64> {
let b1 = self.u8(index)?;
let b2 = self.u8(index + 1)?;
Ok(b1 << 8 | b2)
}
#[inline]
fn u32(&mut self, index: usize) -> Result<u64> {
let b1 = self.u8(index)?;
let b2 = self.u8(index + 1)?;
let b3 = self.u8(index + 2)?;
let b4 = self.u8(index + 3)?;
Ok(b1 << 24 | b2 << 16 | b3 << 8 | b4)
}
#[inline]
fn u64(&mut self, index: usize) -> Result<u64> {
let b1 = self.u8(index)?;
let b2 = self.u8(index + 1)?;
let b3 = self.u8(index + 2)?;
let b4 = self.u8(index + 3)?;
let b5 = self.u8(index + 4)?;
let b6 = self.u8(index + 5)?;
let b7 = self.u8(index + 6)?;
let b8 = self.u8(index + 7)?;
Ok(b1 << 56 | b2 << 48 | b3 << 40 | b4 << 32 | b5 << 24 | b6 << 16 | b7 << 8 | b8)
}
#[inline]
pub fn cbor_type(&mut self) -> Result<Type> {
Ok(Type::from(self.get(0)?))
}
#[inline]
fn cbor_expect_type(&mut self, t: Type) -> Result<()> {
let t_ = self.cbor_type()?;
if t_ != t {
Err(Error::Expected(t, t_))
} else {
Ok(())
}
}
#[inline]
pub fn cbor_len(&mut self) -> Result<(Len, usize)> {
let b: u8 = self.get(0)? & 0b0001_1111;
match b {
0x00..=0x17 => Ok((Len::Len(b as u64), 0)),
0x18 => self.u8(1).map(|v| (Len::Len(v), 1)),
0x19 => self.u16(1).map(|v| (Len::Len(v), 2)),
0x1a => self.u32(1).map(|v| (Len::Len(v), 4)),
0x1b => self.u64(1).map(|v| (Len::Len(v), 8)),
0x1c..=0x1e => Err(Error::UnknownLenType(b)),
0x1f => Ok((Len::Indefinite, 0)),
_ => unreachable!(),
}
}
#[inline]
pub fn cbor_len_sz(&mut self) -> Result<LenSz> {
let b: u8 = self.get(0)? & 0b0001_1111;
match b {
0x00..=0x17 => Ok(LenSz::Len(b as u64, Sz::Inline)),
0x18 => self.u8(1).map(|v| LenSz::Len(v, Sz::One)),
0x19 => self.u16(1).map(|v| LenSz::Len(v, Sz::Two)),
0x1a => self.u32(1).map(|v| LenSz::Len(v, Sz::Four)),
0x1b => self.u64(1).map(|v| LenSz::Len(v, Sz::Eight)),
0x1c..=0x1e => Err(Error::UnknownLenType(b)),
0x1f => Ok(LenSz::Indefinite),
_ => unreachable!(),
}
}
#[inline]
pub fn advance(&mut self, len: usize) -> Result<()> {
self.0.consume(len);
Ok(())
}
pub fn unsigned_integer(&mut self) -> Result<u64> {
Ok(self.unsigned_integer_sz()?.0)
}
pub fn unsigned_integer_sz(&mut self) -> Result<(u64, Sz)> {
self.cbor_expect_type(Type::UnsignedInteger)?;
let len_sz = self.cbor_len_sz()?;
match len_sz {
LenSz::Indefinite => Err(Error::IndefiniteLenNotSupported(Type::UnsignedInteger)),
LenSz::Len(v, sz) => {
self.advance(1 + sz.bytes_following())?;
Ok((v, sz))
}
}
}
pub fn negative_integer(&mut self) -> Result<i64> {
self.cbor_expect_type(Type::NegativeInteger)?;
let (len, len_sz) = self.cbor_len()?;
match len {
Len::Indefinite => Err(Error::IndefiniteLenNotSupported(Type::NegativeInteger)),
Len::Len(v) => {
self.advance(1 + len_sz)?;
Ok(-(v as i64) - 1)
}
}
}
pub fn negative_integer_sz(&mut self) -> Result<(i128, Sz)> {
self.cbor_expect_type(Type::NegativeInteger)?;
let len_sz = self.cbor_len_sz()?;
match len_sz {
LenSz::Indefinite => Err(Error::IndefiniteLenNotSupported(Type::NegativeInteger)),
LenSz::Len(v, sz) => {
self.advance(1 + sz.bytes_following())?;
Ok((-(v as i128) - 1, sz))
}
}
}
pub fn bytes(&mut self) -> Result<Vec<u8>> {
Ok(self.bytes_sz()?.0)
}
pub fn bytes_sz(&mut self) -> Result<(Vec<u8>, StringLenSz)> {
use std::io::Read;
self.cbor_expect_type(Type::Bytes)?;
let len_sz = self.cbor_len_sz()?;
self.advance(1 + len_sz.bytes_following())?;
match len_sz {
LenSz::Indefinite => {
let mut bytes = vec![];
let mut chunk_lens = Vec::new();
while self.cbor_type()? != Type::Special || !self.special_break()? {
self.cbor_expect_type(Type::Bytes)?;
let chunk_len_sz = self.cbor_len_sz()?;
match chunk_len_sz {
LenSz::Indefinite => return Err(Error::InvalidIndefiniteString),
LenSz::Len(len, sz) => {
self.advance(1 + sz.bytes_following())?;
self.0.by_ref().take(len).read_to_end(&mut bytes)?;
chunk_lens.push((len, sz));
}
}
}
Ok((bytes, StringLenSz::Indefinite(chunk_lens)))
}
LenSz::Len(len, sz) => {
let mut bytes = vec![0; len as usize];
self.0.read_exact(&mut bytes)?;
Ok((bytes, StringLenSz::Len(sz)))
}
}
}
pub fn text(&mut self) -> Result<String> {
Ok(self.text_sz()?.0)
}
pub fn text_sz(&mut self) -> Result<(String, StringLenSz)> {
self.cbor_expect_type(Type::Text)?;
let len_sz = self.cbor_len_sz()?;
self.advance(1 + len_sz.bytes_following())?;
match len_sz {
LenSz::Indefinite => {
let mut text = String::new();
let mut chunk_lens = Vec::new();
while self.cbor_type()? != Type::Special || !self.special_break()? {
self.cbor_expect_type(Type::Text)?;
let chunk_len = self.cbor_len_sz()?;
match chunk_len {
LenSz::Indefinite => return Err(Error::InvalidIndefiniteString),
LenSz::Len(len, sz) => {
self.advance(1 + sz.bytes_following())?;
let mut bytes = vec![0; len as usize];
self.0.read_exact(&mut bytes)?;
let chunk_text = String::from_utf8(bytes)?;
text.push_str(&chunk_text);
chunk_lens.push((len, sz));
}
}
}
Ok((text, StringLenSz::Indefinite(chunk_lens)))
}
LenSz::Len(len, sz) => {
let mut bytes = vec![0; len as usize];
self.0.read_exact(&mut bytes)?;
let text = String::from_utf8(bytes)?;
Ok((text, StringLenSz::Len(sz)))
}
}
}
fn internal_items_with<F>(&mut self, len: Len, mut f: F) -> Result<()>
where
F: FnMut(&mut Self) -> Result<()>,
{
match len {
Len::Indefinite => {
while !self.special_break()? {
f(self)?;
}
}
Len::Len(len) => {
for _ in 0..len {
f(self)?;
}
}
}
Ok(())
}
pub fn array(&mut self) -> Result<Len> {
self.cbor_expect_type(Type::Array)?;
let (len, sz) = self.cbor_len()?;
self.advance(1 + sz)?;
Ok(len)
}
pub fn array_sz(&mut self) -> Result<LenSz> {
self.cbor_expect_type(Type::Array)?;
let len_sz = self.cbor_len_sz()?;
self.advance(1 + len_sz.bytes_following())?;
Ok(len_sz)
}
pub fn array_with<F>(&mut self, f: F) -> Result<()>
where
F: FnMut(&mut Self) -> Result<()>,
{
let len = self.array()?;
self.internal_items_with(len, f)
}
pub fn tuple(&mut self, expected_len: u64, error_location: &'static str) -> Result<()> {
let actual_len = self.array()?;
match actual_len {
Len::Len(len) if expected_len == len => Ok(()),
_ => Err(Error::WrongLen(expected_len, actual_len, error_location)),
}
}
pub fn map(&mut self) -> Result<Len> {
self.cbor_expect_type(Type::Map)?;
let (len, sz) = self.cbor_len()?;
self.advance(1 + sz)?;
Ok(len)
}
pub fn map_sz(&mut self) -> Result<LenSz> {
self.cbor_expect_type(Type::Map)?;
let len_sz = self.cbor_len_sz()?;
self.advance(1 + len_sz.bytes_following())?;
Ok(len_sz)
}
pub fn map_with<F>(&mut self, f: F) -> Result<()>
where
F: FnMut(&mut Self) -> Result<()>,
{
let len = self.map()?;
self.internal_items_with(len, f)
}
pub fn tag(&mut self) -> Result<u64> {
Ok(self.tag_sz()?.0)
}
pub fn tag_sz(&mut self) -> Result<(u64, Sz)> {
self.cbor_expect_type(Type::Tag)?;
match self.cbor_len_sz()? {
LenSz::Indefinite => Err(Error::IndefiniteLenNotSupported(Type::Tag)),
LenSz::Len(len, sz) => {
self.advance(1 + sz.bytes_following())?;
Ok((len, sz))
}
}
}
pub fn set_tag(&mut self) -> Result<()> {
let tag = self.tag()?;
if tag != 258 {
return Err(Error::ExpectedSetTag);
}
Ok(())
}
pub fn special_break(&mut self) -> Result<bool> {
self.cbor_expect_type(Type::Special)?;
let b = self.get(0)? & 0b0001_1111;
if b == 0x1f {
self.advance(1)?;
Ok(true)
} else {
Ok(false)
}
}
pub fn special(&mut self) -> Result<Special> {
self.cbor_expect_type(Type::Special)?;
let b = self.get(0)? & 0b0001_1111;
match b {
0x00..=0x13 => {
self.advance(1)?;
Ok(Special::Unassigned(b))
}
0x14 => {
self.advance(1)?;
Ok(Special::Bool(false))
}
0x15 => {
self.advance(1)?;
Ok(Special::Bool(true))
}
0x16 => {
self.advance(1)?;
Ok(Special::Null)
}
0x17 => {
self.advance(1)?;
Ok(Special::Undefined)
}
0x18 => {
let b = self.u8(1)?;
self.advance(2)?;
Ok(Special::Unassigned(b as u8))
}
0x19 => {
let f = self.u16(1)?;
self.advance(3)?;
Ok(Special::Float(f as f64))
}
0x1a => {
let f = self.u32(1)? as u32;
self.advance(5)?;
Ok(Special::Float(f32::from_bits(f) as f64))
}
0x1b => {
let f = self.u64(1)?;
self.advance(9)?;
Ok(Special::Float(f64::from_bits(f)))
}
0x1c..=0x1e => {
self.advance(1)?;
Ok(Special::Unassigned(b))
}
0x1f => {
self.advance(1)?;
Ok(Special::Break)
}
_ => unreachable!(),
}
}
pub fn bool(&mut self) -> Result<bool> {
self.special()?.unwrap_bool()
}
pub fn float(&mut self) -> Result<f64> {
self.special()?.unwrap_float()
}
pub fn deserialize<T>(&mut self) -> Result<T>
where
T: Deserialize,
{
Deserialize::deserialize(self)
}
pub fn deserialize_complete<T>(&mut self) -> Result<T>
where
T: Deserialize,
{
let v = self.deserialize()?;
if !self.0.fill_buf()?.is_empty() {
Err(Error::TrailingData)
} else {
Ok(v)
}
}
}
macro_rules! deserialize_array {
( $( $x:expr ),* ) => {
$(
impl Deserialize for [u8; $x] {
fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self> {
let mut bytes = [0u8; $x];
let len = raw.array()?;
match len {
Len::Indefinite => {
return Err(Error::WrongLen($x, len, "static array"));
},
Len::Len(x) => {
if x != $x {
return Err(Error::WrongLen($x, len, "static array"));
}
}
}
for byte in bytes.iter_mut() {
*byte = Deserialize::deserialize(raw)?;
}
Ok(bytes)
}
}
)*
}
}
deserialize_array!(
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64
);
#[cfg(test)]
#[allow(clippy::bool_assert_comparison)]
mod test {
use super::*;
use std::io::Cursor;
#[test]
fn negative_integer() {
let vec = vec![0x38, 0x29];
let mut raw = Deserializer::from(Cursor::new(vec));
let integer = raw.negative_integer().unwrap();
assert_eq!(integer, -42);
}
#[test]
fn bytes() {
let vec = vec![
0x52, 0x73, 0x6F, 0x6D, 0x65, 0x20, 0x72, 0x61, 0x6E, 0x64, 0x6F, 0x6D, 0x20, 0x73,
0x74, 0x72, 0x69, 0x6E, 0x67,
];
let mut raw = Deserializer::from(Cursor::new(vec.clone()));
let bytes = raw.bytes().unwrap();
assert_eq!(&vec[1..], &*bytes);
}
#[test]
fn bytes_indefinite() {
let chunks = vec![
vec![
0x52, 0x73, 0x6F, 0x6D, 0x65, 0x20, 0x72, 0x61, 0x6E, 0x64, 0x6F, 0x6D, 0x20, 0x73,
0x74, 0x72, 0x69, 0x6E, 0x67,
],
vec![0x44, 0x01, 0x02, 0x03, 0x04],
];
let mut expected = Vec::new();
for chunk in chunks.iter() {
expected.extend_from_slice(&chunk[1..]);
}
let mut vec = vec![0x5f];
for mut chunk in chunks {
vec.append(&mut chunk);
}
vec.push(0xff);
let mut raw = Deserializer::from(Cursor::new(vec.clone()));
let found = raw.bytes().unwrap();
assert_eq!(found, expected);
}
#[test]
fn bytes_empty() {
let vec = vec![0x40];
let mut raw = Deserializer::from(Cursor::new(vec));
let bytes = raw.bytes().unwrap();
assert!(bytes.is_empty());
}
#[test]
fn text() {
let vec = vec![0x64, 0x74, 0x65, 0x78, 0x74];
let mut raw = Deserializer::from(Cursor::new(vec));
let text = raw.text().unwrap();
assert_eq!(&text, "text");
}
#[test]
fn text_indefinite() {
let chunks = vec![vec![0x64, 0x49, 0x45, 0x54, 0x46], vec![0x61, 0x61]];
let expected = "IETFa";
let mut vec = vec![0x7f];
for mut chunk in chunks {
vec.append(&mut chunk);
}
vec.push(0xff);
let mut raw = Deserializer::from(Cursor::new(vec.clone()));
let found = raw.text().unwrap();
assert_eq!(found, expected);
}
#[test]
fn text_empty() {
let vec = vec![0x60];
let mut raw = Deserializer::from(Cursor::new(vec));
let text = raw.text().unwrap();
assert_eq!(&text, "");
}
#[test]
fn float64() {
let vec = vec![0xfb, 0x3f, 0xf1, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a];
let mut raw = Deserializer::from(Cursor::new(vec));
let float = raw.float().unwrap();
assert_eq!(float, 1.1);
}
#[test]
fn float32() {
let vec = vec![0xfa, 0x47, 0xc3, 0x50, 0x00];
let mut raw = Deserializer::from(Cursor::new(vec));
let float = raw.float().unwrap();
assert_eq!(float, 100000.0);
}
#[test]
fn array() {
let vec = vec![0x86, 0, 1, 2, 3, 4, 5];
let mut raw = Deserializer::from(Cursor::new(vec));
let len = raw.array().unwrap();
assert_eq!(len, Len::Len(6));
assert_eq!(0, raw.unsigned_integer().unwrap());
assert_eq!(1, raw.unsigned_integer().unwrap());
assert_eq!(2, raw.unsigned_integer().unwrap());
assert_eq!(3, raw.unsigned_integer().unwrap());
assert_eq!(4, raw.unsigned_integer().unwrap());
assert_eq!(5, raw.unsigned_integer().unwrap());
}
#[test]
fn array_empty() {
let vec = vec![0x80];
let mut raw = Deserializer::from(Cursor::new(vec));
let len = raw.array().unwrap();
assert_eq!(len, Len::Len(0));
}
#[test]
fn array_indefinite() {
let vec = vec![0x9F, 0x01, 0x02, 0xFF];
let mut raw = Deserializer::from(Cursor::new(vec));
let len = raw.array().unwrap();
assert_eq!(len, Len::Indefinite);
let i = raw.unsigned_integer().unwrap();
assert!(i == 1);
let i = raw.unsigned_integer().unwrap();
assert!(i == 2);
assert_eq!(Special::Break, raw.special().unwrap());
}
#[test]
fn vec_bool_definite() {
let vec = vec![0x83, 0xf4, 0xf5, 0xf4];
let mut raw = Deserializer::from(Cursor::new(vec));
let bools = Vec::<bool>::deserialize(&mut raw).unwrap();
assert_eq!(bools, &[false, true, false]);
}
#[test]
fn vec_bool_indefinite() {
let vec = vec![0x9f, 0xf4, 0xf5, 0xf4, 0xff];
let mut raw = Deserializer::from(Cursor::new(vec));
let bools = Vec::<bool>::deserialize(&mut raw).unwrap();
assert_eq!(bools, &[false, true, false]);
}
#[test]
fn complex_array() {
let vec = vec![
0x85, 0x64, 0x69, 0x6F, 0x68, 0x6B, 0x01, 0x20, 0x84, 0, 1, 2, 3, 0x10,
0, 1, 2, 3, 4, 5, 6,
];
let mut raw = Deserializer::from(Cursor::new(vec));
let len = raw.array().unwrap();
assert_eq!(len, Len::Len(5));
assert_eq!("iohk", &raw.text().unwrap());
assert_eq!(1, raw.unsigned_integer().unwrap());
assert_eq!(-1, raw.negative_integer().unwrap());
let nested_array_len = raw.array().unwrap();
assert_eq!(nested_array_len, Len::Len(4));
assert_eq!(0, raw.unsigned_integer().unwrap());
assert_eq!(1, raw.unsigned_integer().unwrap());
assert_eq!(2, raw.unsigned_integer().unwrap());
assert_eq!(3, raw.unsigned_integer().unwrap());
assert_eq!(0x10, raw.unsigned_integer().unwrap());
}
#[test]
fn map() {
let vec = vec![0xA2, 0x00, 0x64, 0x74, 0x65, 0x78, 0x74, 0x01, 0x18, 0x2A];
let mut raw = Deserializer::from(Cursor::new(vec));
let len = raw.map().unwrap();
assert_eq!(len, Len::Len(2));
let k = raw.unsigned_integer().unwrap();
let v = raw.text().unwrap();
assert_eq!(0, k);
assert_eq!("text", &v);
let k = raw.unsigned_integer().unwrap();
let v = raw.unsigned_integer().unwrap();
assert_eq!(1, k);
assert_eq!(42, v);
}
#[test]
fn map_empty() {
let vec = vec![0xA0];
let mut raw = Deserializer::from(Cursor::new(vec));
let len = raw.map().unwrap();
assert_eq!(len, Len::Len(0));
}
#[test]
fn btreemap_bool_definite() {
let vec = vec![0xa2, 0xf4, 0xf5, 0xf5, 0xf4];
let mut raw = Deserializer::from(Cursor::new(vec));
let boolmap = BTreeMap::<bool, bool>::deserialize(&mut raw).unwrap();
assert_eq!(boolmap.len(), 2);
assert_eq!(boolmap[&false], true);
assert_eq!(boolmap[&true], false);
}
#[test]
fn btreemap_bool_indefinite() {
let vec = vec![0xbf, 0xf4, 0xf5, 0xf5, 0xf4, 0xff];
let mut raw = Deserializer::from(Cursor::new(vec));
let boolmap = BTreeMap::<bool, bool>::deserialize(&mut raw).unwrap();
assert_eq!(boolmap.len(), 2);
assert_eq!(boolmap[&false], true);
assert_eq!(boolmap[&true], false);
}
#[test]
fn tag() {
let vec = vec![
0xD8, 0x18, 0x52, 0x73, 0x6F, 0x6D, 0x65, 0x20, 0x72, 0x61, 0x6E, 0x64, 0x6F, 0x6D,
0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
];
let mut raw = Deserializer::from(Cursor::new(vec));
let tag = raw.tag().unwrap();
assert_eq!(24, tag);
let tagged = raw.bytes().unwrap();
assert_eq!(b"some random string", &*tagged);
}
#[test]
fn tag2() {
let vec = vec![
0x82, 0xd8, 0x18, 0x53, 0x52, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64,
0x6f, 0x6d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x1a, 0x71, 0xad, 0x58, 0x36,
];
let mut raw = Deserializer::from(Cursor::new(vec));
let len = raw.array().unwrap();
assert_eq!(len, Len::Len(2));
let tag = raw.tag().unwrap();
assert!(tag == 24);
let _ = raw.bytes().unwrap();
let crc = raw.unsigned_integer().unwrap();
assert!(crc as u32 == 0x71AD5836);
}
#[test]
fn uint_sz() {
let vec = vec![
0x09, 0x18, 0x09, 0x19, 0x00, 0x09, 0x1a, 0x00, 0x00, 0x00, 0x09, 0x1b, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
];
let mut raw = Deserializer::from(Cursor::new(vec));
assert_eq!(raw.unsigned_integer_sz().unwrap(), (9, Sz::Inline));
assert_eq!(raw.unsigned_integer_sz().unwrap(), (9, Sz::One));
assert_eq!(raw.unsigned_integer_sz().unwrap(), (9, Sz::Two));
assert_eq!(raw.unsigned_integer_sz().unwrap(), (9, Sz::Four));
assert_eq!(raw.unsigned_integer_sz().unwrap(), (9, Sz::Eight));
}
#[test]
fn nint_sz() {
let vec = vec![
0x28, 0x38, 0x08, 0x39, 0x00, 0x08, 0x3a, 0x00, 0x00, 0x00, 0x08, 0x3b, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
];
let mut raw = Deserializer::from(Cursor::new(vec));
assert_eq!(raw.negative_integer_sz().unwrap(), (-9, Sz::Inline));
assert_eq!(raw.negative_integer_sz().unwrap(), (-9, Sz::One));
assert_eq!(raw.negative_integer_sz().unwrap(), (-9, Sz::Two));
assert_eq!(raw.negative_integer_sz().unwrap(), (-9, Sz::Four));
assert_eq!(raw.negative_integer_sz().unwrap(), (-9, Sz::Eight));
}
#[test]
fn bytes_sz() {
let def_parts: Vec<Vec<u8>> = vec![
vec![0x44, 0xBA, 0xAD, 0xF0, 0x0D],
vec![0x58, 0x04, 0xCA, 0xFE, 0xD0, 0x0D],
vec![0x59, 0x00, 0x04, 0xDE, 0xAD, 0xBE, 0xEF],
vec![0x5a, 0x00, 0x00, 0x00, 0x02, 0xCA, 0xFE],
vec![
0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xBE, 0xEF,
],
];
let mut vec: Vec<u8> = def_parts.iter().flatten().cloned().collect();
vec.push(0x5F);
for slice in def_parts.iter() {
vec.extend_from_slice(&slice[..]);
}
vec.push(0xFF);
let mut raw = Deserializer::from(Cursor::new(vec));
let indef_bytes = vec![
0xBA, 0xAD, 0xF0, 0x0D, 0xCA, 0xFE, 0xD0, 0x0D, 0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE,
0xBE, 0xEF,
];
let indef_lens = vec![
(4, Sz::Inline),
(4, Sz::One),
(4, Sz::Two),
(2, Sz::Four),
(2, Sz::Eight),
];
assert_eq!(
raw.bytes_sz().unwrap(),
(vec![0xBA, 0xAD, 0xF0, 0x0D], StringLenSz::Len(Sz::Inline))
);
assert_eq!(
raw.bytes_sz().unwrap(),
(vec![0xCA, 0xFE, 0xD0, 0x0D], StringLenSz::Len(Sz::One))
);
assert_eq!(
raw.bytes_sz().unwrap(),
(vec![0xDE, 0xAD, 0xBE, 0xEF], StringLenSz::Len(Sz::Two))
);
assert_eq!(
raw.bytes_sz().unwrap(),
(vec![0xCA, 0xFE], StringLenSz::Len(Sz::Four))
);
assert_eq!(
raw.bytes_sz().unwrap(),
(vec![0xBE, 0xEF], StringLenSz::Len(Sz::Eight))
);
assert_eq!(
raw.bytes_sz().unwrap(),
(indef_bytes, StringLenSz::Indefinite(indef_lens))
);
}
#[test]
fn text_sz() {
let def_parts: Vec<Vec<u8>> = vec![
vec![0x65, 0x48, 0x65, 0x6c, 0x6c, 0x6f],
vec![0x78, 0x05, 0x57, 0x6f, 0x72, 0x6c, 0x64],
vec![
0x79, 0x00, 0x09, 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E,
],
vec![0x7a, 0x00, 0x00, 0x00, 0x01, 0x39],
vec![
0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x41, 0x42, 0x43,
],
];
let mut vec: Vec<u8> = def_parts.iter().flatten().cloned().collect();
vec.push(0x7F);
for slice in def_parts.iter() {
vec.extend_from_slice(&slice[..]);
}
vec.push(0xFF);
let mut raw = Deserializer::from(Cursor::new(vec));
let indef_lens = vec![
(5, Sz::Inline),
(5, Sz::One),
(9, Sz::Two),
(1, Sz::Four),
(3, Sz::Eight),
];
assert_eq!(
raw.text_sz().unwrap(),
("Hello".into(), StringLenSz::Len(Sz::Inline))
);
assert_eq!(
raw.text_sz().unwrap(),
("World".into(), StringLenSz::Len(Sz::One))
);
assert_eq!(
raw.text_sz().unwrap(),
("日本語".into(), StringLenSz::Len(Sz::Two))
);
assert_eq!(
raw.text_sz().unwrap(),
("9".into(), StringLenSz::Len(Sz::Four))
);
assert_eq!(
raw.text_sz().unwrap(),
("ABC".into(), StringLenSz::Len(Sz::Eight))
);
assert_eq!(
raw.text_sz().unwrap(),
(
"HelloWorld日本語9ABC".into(),
StringLenSz::Indefinite(indef_lens)
)
);
}
#[test]
fn array_sz() {
let vec = vec![
0x80, 0x98, 0x01, 0x99, 0x00, 0x02, 0x9a, 0x00, 0x00, 0x00, 0x03, 0x9b, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x9f,
];
let mut raw = Deserializer::from(Cursor::new(vec));
assert_eq!(raw.array_sz().unwrap(), LenSz::Len(0, Sz::Inline));
assert_eq!(raw.array_sz().unwrap(), LenSz::Len(1, Sz::One));
assert_eq!(raw.array_sz().unwrap(), LenSz::Len(2, Sz::Two));
assert_eq!(raw.array_sz().unwrap(), LenSz::Len(3, Sz::Four));
assert_eq!(raw.array_sz().unwrap(), LenSz::Len(4, Sz::Eight));
assert_eq!(raw.array_sz().unwrap(), LenSz::Indefinite);
}
#[test]
fn map_sz() {
let vec = vec![
0xa0, 0xb8, 0x01, 0xb9, 0x00, 0x02, 0xba, 0x00, 0x00, 0x00, 0x03, 0xbb, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xbf,
];
let mut raw = Deserializer::from(Cursor::new(vec));
assert_eq!(raw.map_sz().unwrap(), LenSz::Len(0, Sz::Inline));
assert_eq!(raw.map_sz().unwrap(), LenSz::Len(1, Sz::One));
assert_eq!(raw.map_sz().unwrap(), LenSz::Len(2, Sz::Two));
assert_eq!(raw.map_sz().unwrap(), LenSz::Len(3, Sz::Four));
assert_eq!(raw.map_sz().unwrap(), LenSz::Len(4, Sz::Eight));
assert_eq!(raw.map_sz().unwrap(), LenSz::Indefinite);
}
#[test]
fn tag_sz() {
let vec = vec![
0xc9, 0xd8, 0x01, 0xd9, 0x00, 0x02, 0xda, 0x00, 0x00, 0x00, 0x04, 0xdb, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
];
let mut raw = Deserializer::from(Cursor::new(vec));
assert_eq!(raw.tag_sz().unwrap(), (9, Sz::Inline));
assert_eq!(raw.tag_sz().unwrap(), (1, Sz::One));
assert_eq!(raw.tag_sz().unwrap(), (2, Sz::Two));
assert_eq!(raw.tag_sz().unwrap(), (4, Sz::Four));
assert_eq!(raw.tag_sz().unwrap(), (8, Sz::Eight));
}
}