musli 0.1.7

Müsli is a flexible and efficient serialization framework.
Documentation
use bstr::BStr;
use musli::{Decode, Encode};

macro_rules! integer_tag {
    ($(($ty:ty, $test:ident)),* $(,)?) => {
        $(
            #[test]
            fn $test() {
                #[derive(Debug, PartialEq, Encode, Decode)]
                #[musli(tag(value = 10, type = $ty))]
                #[musli(content(value = 20, type = $ty))]
                pub enum Name {
                    Value,
                }

                #[derive(Debug, PartialEq, Encode, Decode)]
                #[musli(tag(value = 10, type = $ty, method = "sized"))]
                #[musli(content(value = 20, type = $ty, method = "sized"))]
                pub enum NameValue {
                    Value,
                }

                musli::macros::assert_roundtrip_eq! {
                    full,
                    Name::Value
                };

                musli::macros::assert_roundtrip_eq! {
                    full,
                    NameValue::Value
                };
            }
        )*
    };
}

integer_tag! {
    (u8, test_u8),
    (u16, test_u16),
    (u32, test_u32),
    (u64, test_u64),
    (u128, test_u128),
    (i8, test_i8),
    (i16, test_i16),
    (i32, test_i32),
    (i64, test_i64),
    (i128, test_i128),
    (usize, test_usize),
    (isize, test_isize),
}

#[test]
fn integer() {
    #[derive(Debug, PartialEq, Encode, Decode)]
    #[musli(tag(value = 10), content(value = 20))]
    pub enum Enum {
        Value,
    }

    musli::macros::assert_roundtrip_eq! {
        full,
        Enum::Value
    };
}

#[test]
fn integer_value() {
    #[derive(Debug, PartialEq, Encode, Decode)]
    #[musli(tag(value = 10, method = "sized"))]
    #[musli(content(value = 20, method = "sized"))]
    pub enum Enum {
        Value,
    }

    musli::macros::assert_roundtrip_eq! {
        full,
        Enum::Value
    };
}

#[test]
fn string() {
    #[derive(Debug, PartialEq, Encode, Decode)]
    #[musli(tag = "tag")]
    pub enum Enum {
        Value,
    }

    musli::macros::assert_roundtrip_eq! {
        descriptive,
        Enum::Value
    };
}

#[test]
fn string_value() {
    #[derive(Debug, PartialEq, Encode, Decode)]
    #[musli(tag(value = "tag"))]
    #[musli(content(value = "content"))]
    pub enum Enum {
        Value,
    }

    musli::macros::assert_roundtrip_eq! {
        descriptive,
        Enum::Value
    };
}

#[test]
fn string_value_type() {
    #[derive(Debug, PartialEq, Encode, Decode)]
    #[musli(tag(value = "tag", type = str))]
    #[musli(content(value = "content", type = str))]
    pub enum Enum {
        Value,
    }

    musli::macros::assert_roundtrip_eq! {
        descriptive,
        Enum::Value
    };
}

#[test]
fn string_value_type_unsized() {
    #[derive(Debug, PartialEq, Encode, Decode)]
    #[musli(tag(value = "tag", type = str, method = "unsized"))]
    #[musli(content(value = "content", type = str, method = "unsized"))]
    pub enum Enum {
        Value,
    }

    musli::macros::assert_roundtrip_eq! {
        descriptive,
        Enum::Value
    };
}

#[test]
#[ignore = "TODO: figure out why this is currently not supported"]
fn bytes_value() {
    #[derive(Debug, PartialEq, Encode, Decode)]
    #[musli(tag(value = b"tag", format_with = BStr::new))]
    #[musli(content(value = b"content", format_with = BStr::new))]
    pub enum Enum {
        Value,
    }

    musli::macros::assert_roundtrip_eq! {
        full,
        Enum::Value
    };
}

#[test]
#[ignore = "TODO: figure out why this is currently not supported"]
fn bytes_value_type() {
    #[derive(Debug, PartialEq, Encode, Decode)]
    #[musli(tag(value = b"tag", type = [u8], format_with = BStr::new))]
    #[musli(content(value = b"content", type = [u8], format_with = BStr::new))]
    pub enum Enum {
        Value,
    }

    musli::macros::assert_roundtrip_eq! {
        full,
        Enum::Value
    };
}

#[test]
#[ignore = "TODO: figure out why this is currently not supported"]
fn unsized_bytes() {
    #[derive(Debug, PartialEq, Encode, Decode)]
    #[musli(tag(value = b"tag", type = [u8], method = "unsized_bytes", format_with = BStr::new))]
    #[musli(content(value = b"content", type = [u8], method = "unsized_bytes", format_with = BStr::new))]
    pub enum Enum {
        Value,
    }

    musli::macros::assert_roundtrip_eq! {
        full,
        Enum::Value
    };
}