serde-ordered 0.3.2

A procedural macro for deserializing ordered arrays into keyed structs using Serde.
Documentation
use serde::{Deserialize, Serialize};
use serde_ordered::DeserializeOrdered;

#[derive(Deserialize, Serialize, Default)]
struct Foo {
    pub buz: i32,
    pub biz: Option<String>,
    pub bar: Bar,
    pub bop: u64,
}

#[derive(Deserialize, Serialize, Default)]
struct Bar {
    pub buf: i32,
    pub bif: String,
}

#[derive(DeserializeOrdered)]
struct SlimFoo {
    #[order(1)]
    pub biz: Option<String>,

    #[order(2)]
    pub bar: SlimBar,
}

#[derive(DeserializeOrdered)]
struct SlimBar {
    #[order(1)]
    pub bif: String,
}

#[test]
fn deserialize_unnamed_json() {
    let foo_str = r#"[1, null, [100, "100"]]"#;
    let slim_foo = serde_json::from_str::<SlimFoo>(&foo_str).unwrap();

    assert!(slim_foo.biz.is_none());
    assert_eq!(slim_foo.bar.bif, "100");
}

#[test]
fn deserialize_named_json() {
    let foo_str =
        r#"{"buz":42,"biz":"helloworld","bar":{"buf":7,"bif":"example"},"bop":123456789}"#;
    let slim_foo = serde_json::from_str::<SlimFoo>(&foo_str).unwrap();

    let biz = slim_foo.biz.expect("Fiz should be present");
    assert_eq!(biz, "helloworld");
    assert_eq!(slim_foo.bar.bif, "example");
}

#[test]
fn deserialize_unnamed_messagepack() {
    let mut foo = Foo::default();
    foo.biz = Some("biz".to_string());
    foo.bar.bif = "99".into();

    let foo_bytes = rmp_serde::to_vec(&foo).unwrap();

    let slim_foo = rmp_serde::from_slice::<SlimFoo>(&foo_bytes).unwrap();

    assert_eq!(slim_foo.biz.unwrap(), "biz");
    assert_eq!(slim_foo.bar.bif, "99");
}

#[test]
fn deserialize_named_messagepack() {
    let mut foo = Foo::default();
    foo.biz = Some("biz".to_string());
    foo.bar.bif = "99".into();

    let foo_bytes = rmp_serde::to_vec_named(&foo).unwrap();

    let slim_foo = rmp_serde::from_slice::<SlimFoo>(&foo_bytes).unwrap();

    assert_eq!(slim_foo.biz.unwrap(), "biz");
    assert_eq!(slim_foo.bar.bif, "99");
}