serde_either 0.2.1

Simple set to enums to deserialize and serialize data that can either be string, struct or vec
Documentation
mod common;

use crate::common::SimpleStruct;
use serde_either::{SingleOrVec, StringOrStruct, StringOrStructOrVec};
use serde_json;

mod string_or_struct {
    use super::*;

    mod serialize {
        use super::*;

        #[test]
        fn string_value() {
            let value = StringOrStruct::<SimpleStruct>::String(String::from("Some string"));

            let res = serde_json::to_string(&value);

            assert_eq!(res.unwrap(), "\"Some string\"");
        }

        #[test]
        fn struct_value() {
            let value = StringOrStruct::<SimpleStruct>::Struct(SimpleStruct {
                number: 912,
                text: String::from("some text"),
            });

            let res = serde_json::to_string(&value);

            assert_eq!(res.unwrap(), "{\"number\":912,\"text\":\"some text\"}");
        }

        #[test]
        fn struct_as_vec_value() {
            let value = StringOrStruct::<Vec<SimpleStruct>>::Struct(vec![
                SimpleStruct {
                    number: 912,
                    text: String::from("some text"),
                },
                SimpleStruct {
                    number: 100,
                    text: String::from(""),
                },
            ]);

            let res = serde_json::to_string(&value);

            assert_eq!(
                res.unwrap(),
                "[{\"number\":912,\"text\":\"some text\"},{\"number\":100,\"text\":\"\"}]"
            );
        }
    }
}

mod string_or_struct_or_vec {
    use super::*;

    mod serialize {
        use super::*;

        #[test]
        fn string_value() {
            let value = StringOrStructOrVec::<SimpleStruct, Vec<SimpleStruct>>::String(
                String::from("Some string"),
            );

            let res = serde_json::to_string(&value);

            assert_eq!(res.unwrap(), "\"Some string\"");
        }

        #[test]
        fn struct_value() {
            let value =
                StringOrStructOrVec::<SimpleStruct, Vec<SimpleStruct>>::Struct(SimpleStruct {
                    number: 912,
                    text: String::from("some text"),
                });

            let res = serde_json::to_string(&value);

            assert_eq!(res.unwrap(), "{\"number\":912,\"text\":\"some text\"}");
        }

        #[test]
        fn vec_value() {
            let value = StringOrStructOrVec::<SimpleStruct, Vec<SimpleStruct>>::Vec(vec![
                SimpleStruct {
                    number: 912,
                    text: String::from("some text"),
                },
                SimpleStruct {
                    number: 100,
                    text: String::from(""),
                },
            ]);

            let res = serde_json::to_string(&value);

            assert_eq!(
                res.unwrap(),
                "[{\"number\":912,\"text\":\"some text\"},{\"number\":100,\"text\":\"\"}]"
            );
        }
    }
}

mod single_or_vec {
    use super::*;

    #[test]
    fn single_value() {
        let value = SingleOrVec::Single(SimpleStruct {
            number: 912,
            text: String::from("some text"),
        });

        let res = serde_json::to_string(&value);

        assert_eq!(res.unwrap(), r#"{"number":912,"text":"some text"}"#);
    }

    #[test]
    fn vec_value() {
        let value = SingleOrVec::Vec(vec![
            SimpleStruct {
                number: 912,
                text: String::from("some text"),
            },
            SimpleStruct {
                number: 100,
                text: String::from("text"),
            },
        ]);

        let res = serde_json::to_string(&value);

        assert_eq!(
            res.unwrap(),
            r#"[{"number":912,"text":"some text"},{"number":100,"text":"text"}]"#
        );
    }
}