serde_yaml_neo

Crates.ioserde_yaml_neo
lib.rsserde_yaml_neo
version0.11.0
created_at2026-01-20 11:43:23.765615+00
updated_at2026-01-20 13:28:50.901003+00
descriptionYAML data format for Serde
homepage
repositoryhttps://github.com/firstdorsal/serde-yaml-neo
max_upload_size
id2056438
size418,980
Paul Colin Hennig (firstdorsal)

documentation

https://docs.rs/serde_yaml_neo/

README

Serde YAML Neo

github crates.io docs.rs build status

Rust library for using the Serde serialization framework with data in YAML file format. This library only follows the YAML specification 1.1..

Dependency

[dependencies]
serde = "1.0"
serde_yaml_neo = "0.10"

Release notes are available under GitHub releases.

Using Serde YAML

API documentation is available in rustdoc form but the general idea is:

use std::collections::BTreeMap;

fn main() -> Result<(), serde_yaml_neo::Error> {
    // You have some type.
    let mut map = BTreeMap::new();
    map.insert("x".to_string(), 1.0);
    map.insert("y".to_string(), 2.0);

    // Serialize it to a YAML string.
    let yaml = serde_yaml_neo::to_string(&map)?;
    assert_eq!(yaml, "x: 1.0\ny: 2.0\n");

    // Deserialize it back to a Rust type.
    let deserialized_map: BTreeMap<String, f64> = serde_yaml_neo::from_str(&yaml)?;
    assert_eq!(map, deserialized_map);
    Ok(())
}

It can also be used with Serde's derive macros to handle structs and enums defined in your program.

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_yaml_neo = "0.10"

Structs serialize in the obvious way:

use serde::{Serialize, Deserialize};

#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Point {
    x: f64,
    y: f64,
}

fn main() -> Result<(), serde_yaml_neo::Error> {
    let point = Point { x: 1.0, y: 2.0 };

    let yaml = serde_yaml_neo::to_string(&point)?;
    assert_eq!(yaml, "x: 1.0\ny: 2.0\n");

    let deserialized_point: Point = serde_yaml_neo::from_str(&yaml)?;
    assert_eq!(point, deserialized_point);
    Ok(())
}

Enums serialize using YAML's !tag syntax to identify the variant name.

use serde::{Serialize, Deserialize};

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

fn main() -> Result<(), serde_yaml_neo::Error> {
    let yaml = "
        - !Newtype 1
        - !Tuple [0, 0, 0]
        - !Struct {x: 1.0, y: 2.0}
    ";
    let values: Vec<Enum> = serde_yaml_neo::from_str(yaml).unwrap();
    assert_eq!(values[0], Enum::Newtype(1));
    assert_eq!(values[1], Enum::Tuple(0, 0, 0));
    assert_eq!(values[2], Enum::Struct { x: 1.0, y: 2.0 });

    // The last two in YAML's block style instead:
    let yaml = "
        - !Tuple
          - 0
          - 0
          - 0
        - !Struct
          x: 1.0
          y: 2.0
    ";
    let values: Vec<Enum> = serde_yaml_neo::from_str(yaml).unwrap();
    assert_eq!(values[0], Enum::Tuple(0, 0, 0));
    assert_eq!(values[1], Enum::Struct { x: 1.0, y: 2.0 });

    // Variants with no data can be written using !Tag or just the string name.
    let yaml = "
        - Unit  # serialization produces this one
        - !Unit
    ";
    let values: Vec<Enum> = serde_yaml_neo::from_str(yaml).unwrap();
    assert_eq!(values[0], Enum::Unit);
    assert_eq!(values[1], Enum::Unit);

    Ok(())
}

Configurable Indentation

You can customize the indentation level (2-9 spaces) when serializing:

use std::collections::BTreeMap;

fn main() -> Result<(), serde_yaml_neo::Error> {
    let mut data = BTreeMap::new();
    data.insert("outer", BTreeMap::from([("inner", 1)]));

    // Default 2-space indent
    let yaml = serde_yaml_neo::to_string(&data)?;

    // Custom 4-space indent
    let yaml = serde_yaml_neo::to_string_with_indent(&data, 4)?;

    Ok(())
}

License

Licensed MIT license.

Commit count: 987

cargo fmt