[go: up one dir, main page]

serde_with 1.1.0

Custom de/serialization functions for Rust's serde
Documentation
#[macro_use]
extern crate serde_json;

#[macro_use]
extern crate serde_derive;

#[macro_use]
extern crate serde_with;

#[macro_use]
extern crate pretty_assertions;

extern crate serde;

use std::collections::HashMap;

#[test]
fn test_flatten_with_prefix() {
    #[derive(Serialize, Deserialize, PartialEq, Debug)]
    struct Match {
        #[serde(flatten, with = "prefix_player1")]
        player1: Player,
        #[serde(flatten, with = "prefix_player2")]
        player2: Option<Player>,
        #[serde(flatten, with = "prefix_player3")]
        player3: Option<Player>,
        #[serde(flatten, with = "prefix_tag")]
        tags: HashMap<String, String>,
    }

    #[derive(Serialize, Deserialize, PartialEq, Debug)]
    struct Player {
        name: String,
        votes: u64,
    }

    with_prefix!(prefix_player1 "player1_");
    with_prefix!(prefix_player2 "player2_");
    with_prefix!(prefix_player3 "player3_");
    with_prefix!(prefix_tag "tag_");

    let m = Match {
        player1: Player {
            name: "name1".to_owned(),
            votes: 1,
        },
        player2: Some(Player {
            name: "name2".to_owned(),
            votes: 2,
        }),
        player3: None,
        tags: {
            let mut tags = HashMap::new();
            tags.insert("t".to_owned(), "T".to_owned());
            tags
        },
    };

    let expected = json!({
        "player1_name": "name1",
        "player1_votes": 1,
        "player2_name": "name2",
        "player2_votes": 2,
        "tag_t": "T"
    });

    let j = serde_json::to_string(&m).unwrap();
    assert_eq!(j, expected.to_string());

    assert_eq!(m, serde_json::from_str(&j).unwrap());
}

#[test]
fn test_plain_with_prefix() {
    #[derive(Serialize, Deserialize, PartialEq, Debug)]
    struct Match {
        #[serde(with = "prefix_player1")]
        player1: Player,
        #[serde(with = "prefix_player2")]
        player2: Option<Player>,
        #[serde(with = "prefix_player3")]
        player3: Option<Player>,
        #[serde(with = "prefix_tag")]
        tags: HashMap<String, String>,
    }

    #[derive(Serialize, Deserialize, PartialEq, Debug)]
    struct Player {
        name: String,
        votes: u64,
    }

    with_prefix!(prefix_player1 "player1_");
    with_prefix!(prefix_player2 "player2_");
    with_prefix!(prefix_player3 "player3_");
    with_prefix!(prefix_tag "tag_");

    let m = Match {
        player1: Player {
            name: "name1".to_owned(),
            votes: 1,
        },
        player2: Some(Player {
            name: "name2".to_owned(),
            votes: 2,
        }),
        player3: None,
        tags: {
            let mut tags = HashMap::new();
            tags.insert("t".to_owned(), "T".to_owned());
            tags
        },
    };

    let expected = json!({
        "player1": {
            "player1_name": "name1",
            "player1_votes": 1,
        },
        "player2": {
            "player2_name": "name2",
            "player2_votes": 2,
        },
        "player3": null,
        "tags": {
            "tag_t": "T"
        }
    });

    let j = serde_json::to_string(&m).unwrap();
    assert_eq!(j, expected.to_string());

    assert_eq!(m, serde_json::from_str(&j).unwrap());
}