serde_structuredqs 0.2.0

A Rust library for serialize/deserialize structured query-string.
Documentation
#[cfg(test)]
mod test {
    use serde::Deserialize;

    #[test]
    fn test_deserialize_flat() {
        #[derive(Debug, Deserialize, Eq, PartialEq)]
        struct SearchParams {
            keyword: Option<String>,
            limit: Option<u32>,
        }

        let expected = SearchParams {
            keyword: Some(String::from("foo")),
            limit: Some(20),
        };

        let source = "keyword=foo&limit=20";
        let actual: SearchParams = serde_structuredqs::from_str(source).unwrap();
        assert_eq!(actual, expected)
    }

    #[test]
    fn test_deserialize_structured() {
        #[derive(Debug, Deserialize, Eq, PartialEq)]
        struct SearchParams {
            keyword: Option<String>,
            limit: Option<u32>,
            filter: Option<FilteringParameter>,
        }

        #[derive(Debug, Deserialize, Eq, PartialEq)]
        struct FilteringParameter {
            category: Option<String>,
            difficulty: Option<RangeFilteringParameter<i32>>,
        }

        #[derive(Debug, Deserialize, Eq, PartialEq)]
        struct RangeFilteringParameter<T> {
            from: Option<T>,
            to: Option<T>,
        }

        let expected = SearchParams {
            keyword: Some(String::from("foo")),
            limit: Some(20),
            filter: Some(FilteringParameter {
                category: Some(String::from("A")),
                difficulty: Some(RangeFilteringParameter {
                    from: None,
                    to: Some(800),
                }),
            }),
        };

        let source = "keyword=foo&limit=20&filter.category=A&filter.difficulty.to=800";
        let actual: SearchParams = serde_structuredqs::from_str(source).unwrap();
        assert_eq!(actual, expected)
    }

    #[test]
    fn deserialize_vec() {
        #[derive(Debug, Deserialize, Eq, PartialEq)]
        struct MyStruct {
            a: Vec<String>,
            b: Option<Vec<String>>,
            c: Vec<i32>,
        }

        let expected = MyStruct {
            a: vec![
                String::from("foo"),
                String::from("bar"),
                String::from("baz"),
            ],
            b: Some(vec![String::from("foo")]),
            c: vec![100, 200],
        };
        let source = "a=foo,bar,baz&b=foo&c=100,200";
        let actual: MyStruct = serde_structuredqs::from_str(source).unwrap();
        assert_eq!(actual, expected)
    }

    #[test]
    fn deserialize_vec_with_unwise_comma_separated() {
        #[derive(Debug, Deserialize, Eq, PartialEq)]
        struct MyStruct {
            a: Vec<String>,
        }

        let expected = MyStruct {
            a: vec![
                String::from("foo"),
                String::from("bar"),
                String::from("baz"),
            ],
        };
        let actual: MyStruct = serde_structuredqs::from_str("a=,,,,foo,,,,,,bar,baz,,,,").unwrap();
        assert_eq!(actual, expected)
    }

    #[test]
    fn deserialize_hollow_vec() {
        #[derive(Debug, Deserialize, Eq, PartialEq)]
        struct MyStruct {
            a: Vec<String>,
            b: Option<Vec<String>>,
        }

        let expected = MyStruct {
            a: vec![],
            b: Some(vec![]),
        };
        let actual: MyStruct = serde_structuredqs::from_str("a=,,,,,&b=,,,,").unwrap();
        assert_eq!(actual, expected)
    }

    #[test]
    fn deserialize_empty_vec() {
        #[derive(Debug, Deserialize, Eq, PartialEq)]
        struct MyStruct {
            a: Vec<String>,
            b: Option<Vec<String>>,
        }

        let expected = MyStruct { a: vec![], b: None };
        let actual: MyStruct = serde_structuredqs::from_str("a=&b=").unwrap();
        assert_eq!(actual, expected)
    }
}