chive 0.1.0

A low-level type-safe binary serialization library with support for numbers, arrays, strings, and nested sub-archives
Documentation
use crate::{Chive, PrimitiveType, ValueType};

#[test]
fn end_to_end_test() {
    let chive = Chive::with_chive_in(|mut ci| {
        ci.u8(1);
        ci.u16(2);
        ci.array_slice_u8(&[0, 1, 2, 3]);
        ci.array_slice_u64(&[10, 11, 12, 13]);
        ci.string("Testing");

        ci.nest(|mut ci| {
            ci.u8(3);
            ci.u16(4);
            ci.array_slice_u8(&[20, 21, 22, 23]);
            ci.array_slice_u64(&[30, 31, 32, 33]);
        });

        ci.u8(1);
    });

    let mut co1 = chive.chive_out().unwrap();
    assert_eq!(
        co1.peek_type().unwrap(),
        ValueType::Primitive(PrimitiveType::U8)
    );
    assert!(co1.peek_length_bytes().is_err());
    assert_eq!(co1.u8().unwrap(), 1);
    assert_eq!(
        co1.peek_type().unwrap(),
        ValueType::Primitive(PrimitiveType::U16)
    );
    assert!(co1.peek_length_bytes().is_err());
    assert_eq!(co1.u16().unwrap(), 2);
    assert_eq!(
        co1.peek_type().unwrap(),
        ValueType::Array(PrimitiveType::U8)
    );
    assert_eq!(co1.peek_length_bytes().unwrap(), 4);
    assert_eq!(co1.array_slice_u8().unwrap(), vec![0, 1, 2, 3]);
    assert_eq!(
        co1.peek_type().unwrap(),
        ValueType::Array(PrimitiveType::U64)
    );
    assert_eq!(co1.peek_length_bytes().unwrap(), 4);
    assert_eq!(co1.array_slice_u64().unwrap(), vec![10, 11, 12, 13]);
    assert_eq!(co1.peek_type().unwrap(), ValueType::String);
    assert_eq!(co1.peek_length_bytes().unwrap(), "Testing".as_bytes().len());
    assert_eq!(co1.string().unwrap(), "Testing");

    assert_eq!(co1.peek_type().unwrap(), ValueType::Nest);
    {
        let mut co2 = co1.nest().unwrap();
        assert_eq!(
            co2.peek_type().unwrap(),
            ValueType::Primitive(PrimitiveType::U8)
        );
        assert!(co2.peek_length_bytes().is_err());
        assert_eq!(co2.u8().unwrap(), 3);
        assert_eq!(
            co2.peek_type().unwrap(),
            ValueType::Primitive(PrimitiveType::U16)
        );
        assert!(co2.peek_length_bytes().is_err());
        assert_eq!(co2.u16().unwrap(), 4);
        assert_eq!(
            co2.peek_type().unwrap(),
            ValueType::Array(PrimitiveType::U8)
        );
        assert_eq!(co2.peek_length_bytes().unwrap(), 4);
        assert_eq!(co2.array_slice_u8().unwrap(), vec![20, 21, 22, 23]);
        assert_eq!(
            co2.peek_type().unwrap(),
            ValueType::Array(PrimitiveType::U64)
        );
        assert_eq!(co2.peek_length_bytes().unwrap(), 4);
        assert_eq!(co2.array_slice_u64().unwrap(), vec![30, 31, 32, 33]);
        assert!(co2.peek_type().is_err());
        assert!(co2.peek_length_bytes().is_err());
        assert!(co2.is_empty());
    }

    assert_eq!(
        co1.peek_type().unwrap(),
        ValueType::Primitive(PrimitiveType::U8)
    );
    assert!(co1.peek_length_bytes().is_err());
    assert_eq!(co1.u8().unwrap(), 1);

    assert!(co1.peek_type().is_err());
    assert!(co1.peek_length_bytes().is_err());
    assert!(co1.is_empty());
}

#[test]
fn empty_nest_test() {
    let chive = Chive::with_chive_in(|mut ci| {
        ci.u8(0xAA);
        ci.nest(|_| {});
        ci.u8(0xBB);
    });

    let mut co1 = chive.chive_out().unwrap();
    assert_eq!(co1.u8().unwrap(), 0xAA);
    {
        let co2 = co1.nest().unwrap();
        assert!(co2.is_empty());
    }
    assert_eq!(co1.u8().unwrap(), 0xBB);
}

#[test]
fn nested_empty_nest_test() {
    let chive = Chive::with_chive_in(|mut ci| {
        ci.u8(0xAA);
        ci.nest(|mut ci| {
            ci.u8(0x11);
            {
                ci.nest(|_| {});
            }
            ci.u8(0x22);
        });
        ci.u8(0xBB);
    });

    let mut co1 = chive.chive_out().unwrap();
    assert_eq!(co1.u8().unwrap(), 0xAA);
    {
        let mut co2 = co1.nest().unwrap();
        assert_eq!(co2.u8().unwrap(), 0x11);
        {
            let co3 = co2.nest().unwrap();
            assert!(co3.is_empty());
        }
        assert_eq!(co2.u8().unwrap(), 0x22);
        assert!(co2.is_empty());
    }
    assert_eq!(co1.u8().unwrap(), 0xBB);
    assert!(co1.is_empty());
}