Convert Figma logo to code with AI

dtolnay logoserde-yaml

Strongly typed YAML library for Rust

1,011
209
1,011
50

Top Related Projects

5,444

Strongly typed JSON library for Rust

1,023

A TOML encoding/decoding library for Rust

4,831

TOML parser for Golang with reflection.

Quick Overview

serde-yaml is a Rust library that provides YAML support for Serde, a popular serialization and deserialization framework. It allows seamless conversion between Rust data structures and YAML format, making it easy to work with YAML data in Rust applications.

Pros

  • Seamless integration with Serde, leveraging its powerful derive macros
  • High performance and memory efficiency
  • Supports both serialization and deserialization of YAML data
  • Comprehensive support for YAML 1.2 specification

Cons

  • Limited support for YAML-specific features like anchors and aliases
  • May have a steeper learning curve for developers new to Serde
  • Occasional breaking changes between major versions
  • Some advanced YAML features might require manual implementation

Code Examples

  1. Deserializing YAML to a Rust struct:
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
struct Config {
    name: String,
    age: u32,
}

fn main() -> Result<(), serde_yaml::Error> {
    let yaml = "
        name: John Doe
        age: 30
    ";
    let config: Config = serde_yaml::from_str(yaml)?;
    println!("{:?}", config);
    Ok(())
}
  1. Serializing a Rust struct to YAML:
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct Person {
    name: String,
    age: u32,
}

fn main() -> Result<(), serde_yaml::Error> {
    let person = Person {
        name: "Alice".to_string(),
        age: 25,
    };
    let yaml = serde_yaml::to_string(&person)?;
    println!("{}", yaml);
    Ok(())
}
  1. Working with YAML sequences:
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
struct Item {
    name: String,
    quantity: u32,
}

fn main() -> Result<(), serde_yaml::Error> {
    let yaml = "
        - name: Apple
          quantity: 5
        - name: Banana
          quantity: 3
    ";
    let items: Vec<Item> = serde_yaml::from_str(yaml)?;
    println!("{:?}", items);
    Ok(())
}

Getting Started

To use serde-yaml in your Rust project, add the following to your Cargo.toml:

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_yaml = "0.9"

Then, in your Rust code, you can import and use serde-yaml like this:

use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct MyStruct {
    // Your struct fields here
}

fn main() {
    // Use serde_yaml::to_string() for serialization
    // Use serde_yaml::from_str() for deserialization
}

Competitor Comparisons

5,444

Strongly typed JSON library for Rust

Pros of serde_json

  • Faster parsing and serialization due to JSON's simpler structure
  • Wider adoption and more extensive ecosystem support
  • Smaller file sizes for equivalent data structures

Cons of serde_json

  • Less human-readable compared to YAML
  • Limited support for complex data structures like comments or anchors
  • Stricter syntax rules, making it less forgiving for manual editing

Code Comparison

serde_json:

use serde_json::json;

let data = json!({
    "name": "John Doe",
    "age": 30,
    "city": "New York"
});

serde_yaml:

use serde_yaml::to_string;

let data = serde_yaml::to_string(&vec![
    ("name", "John Doe"),
    ("age", "30"),
    ("city", "New York"),
])?;

Both libraries provide similar functionality for serialization and deserialization, but serde_json focuses on JSON format, while serde_yaml handles YAML. The syntax and usage differ slightly, with serde_json offering a more concise json! macro for creating JSON objects. serde_yaml requires explicit conversion to strings for similar structures. Overall, the choice between these libraries depends on the specific requirements of your project, such as data complexity, human readability, and performance needs.

1,023

A TOML encoding/decoding library for Rust

Pros of toml-rs

  • Specialized for TOML format, offering more tailored features and optimizations
  • Lighter weight and potentially faster for TOML-specific use cases
  • Simpler API for basic TOML parsing and serialization tasks

Cons of toml-rs

  • Limited to TOML format, less versatile compared to serde-yaml's YAML support
  • Smaller community and ecosystem compared to serde-yaml
  • May have fewer advanced features or customization options

Code Comparison

toml-rs:

use toml::from_str;

let config: MyConfig = from_str(&toml_string)?;

serde-yaml:

use serde_yaml::from_str;

let config: MyConfig = from_str(&yaml_string)?;

Both libraries offer similar ease of use for basic parsing, with the main difference being the format they support. toml-rs is specifically designed for TOML, while serde-yaml handles YAML. The choice between them largely depends on the specific data format requirements of your project.

4,831

TOML parser for Golang with reflection.

Pros of toml

  • Simpler syntax and more human-readable format compared to YAML
  • Better support for nested data structures
  • Stricter parsing rules, reducing ambiguity and potential errors

Cons of toml

  • Less flexible than YAML for complex data structures
  • Limited support for custom data types
  • Smaller ecosystem and fewer third-party tools compared to YAML

Code Comparison

toml:

[package]
name = "my_package"
version = "0.1.0"
authors = ["John Doe <john@example.com>"]

[dependencies]
serde = "1.0"

serde-yaml:

package:
  name: my_package
  version: 0.1.0
  authors:
    - John Doe <john@example.com>
dependencies:
  serde: "1.0"

Both libraries provide seamless integration with Serde for serialization and deserialization. toml offers a more straightforward syntax for configuration files, while serde-yaml provides greater flexibility for complex data structures. The choice between the two depends on the specific requirements of your project, such as the complexity of the data being handled and the preference for readability vs. flexibility.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

Serde YAML

github crates.io docs.rs build status

Rust library for using the Serde serialization framework with data in YAML file format. (This project is no longer maintained.)

Dependency

[dependencies]
serde = "1.0"
serde_yaml = "0.9"

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::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::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::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 = "0.9"

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::Error> {
    let point = Point { x: 1.0, y: 2.0 };

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

    let deserialized_point: Point = serde_yaml::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::Error> {
    let yaml = "
        - !Newtype 1
        - !Tuple [0, 0, 0]
        - !Struct {x: 1.0, y: 2.0}
    ";
    let values: Vec<Enum> = serde_yaml::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::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::from_str(yaml).unwrap();
    assert_eq!(values[0], Enum::Unit);
    assert_eq!(values[1], Enum::Unit);

    Ok(())
}

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.