serde_yaml::with

Module singleton_map

Source
Expand description

Serialize/deserialize an enum using a YAML map containing one entry in which the key identifies the variant name.

§Example

use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum Enum {
    Unit,
    Newtype(usize),
    Tuple(usize, usize),
    Struct { value: usize },
}

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Struct {
    #[serde(with = "serde_yaml::with::singleton_map")]
    w: Enum,
    #[serde(with = "serde_yaml::with::singleton_map")]
    x: Enum,
    #[serde(with = "serde_yaml::with::singleton_map")]
    y: Enum,
    #[serde(with = "serde_yaml::with::singleton_map")]
    z: Enum,
}

fn main() {
    let object = Struct {
        w: Enum::Unit,
        x: Enum::Newtype(1),
        y: Enum::Tuple(1, 1),
        z: Enum::Struct { value: 1 },
    };

    let yaml = serde_yaml::to_string(&object).unwrap();
    print!("{}", yaml);

    let deserialized: Struct = serde_yaml::from_str(&yaml).unwrap();
    assert_eq!(object, deserialized);
}

The representation using singleton_map on all the fields is:

w: Unit
x:
  Newtype: 1
y:
  Tuple:
  - 1
  - 1
z:
  Struct:
    value: 1

Without singleton_map, the default behavior would have been to serialize as:

w: Unit
x: !Newtype 1
y: !Tuple
- 1
- 1
z: !Struct
  value: 1

Functions§