#yaml-parser #parser #node #directive #atoms #position #tags

no-std yaml-peg

A YAML 1.2 parser using a greedy parsing algorithm with PEG atoms

41 releases (9 stable)

new 1.0.8 May 10, 2024
1.0.7 Jan 12, 2024
1.0.6 Sep 18, 2023
1.0.5 Aug 31, 2022
0.12.0 Jul 26, 2021

#227 in Parser implementations

Download history 20/week @ 2024-02-19 20/week @ 2024-02-26 1/week @ 2024-03-04 47/week @ 2024-03-11 47/week @ 2024-03-25 110/week @ 2024-04-01 2/week @ 2024-04-15 1/week @ 2024-04-22 254/week @ 2024-04-29 147/week @ 2024-05-06

404 downloads per month
Used in 2 crates

MIT license

120KB
2.5K SLoC

yaml-peg

dependency status documentation

A YAML 1.2 parser using a greedy parsing algorithm with PEG atoms. Support anchors, directives, positions, tags, serde, and no-std.

Inspired from yaml-rust and serde-yaml.

This parser is not ensure about YAML spec but almost functions are well-implemented. The buffer reader has also not yet been implemented, but the chunks can be read by the sub-parsers.

The anchors can be visited by the loader after parsing.

use yaml_peg::{parse, node};

let doc = "
---
name: Bob
married: true
age: 46
";
let root = parse(doc).unwrap();
assert_eq!(root, vec![node!({
    "name" => "Bob",
    "married" => true,
    "age" => 46,
})]);

See the API doc for more information.

Features

  • Support no standard library #![no_std].

  • Different data holder Rc / Arc provides parallel visiting and less copy cost.

  • Provide document positions and tags on the nodes.

  • Support anchors / alias.

    • Direct mode: Embed the alias directly.
    • Cyclic mode: Keep the alias placeholder, for cyclic data.
  • Support YAML directives YAML and TAG.

    WARNING: %YAML 1.1 will still be treated as 1.2.

    %YAML 1.2
    %TAG !x! tag:my.prefix:
    ---
    
  • Support serde to help you serialize and deserialize a specific type. (as well as the non-cyclic anchors)

    use serde::Deserialize;
    use yaml_peg::serde::from_str;
    
    #[derive(Deserialize)]
    struct Member {
       name: String,
       married: bool,
       age: u8,
    }
    
    let doc = "
    ---
    name: Bob
    married: true
    age: 46
    ";
    // Return Vec<Member>, use `.remove(0)` to get the first one
    let officer = from_str::<Member>(doc).unwrap().remove(0);
    assert_eq!("Bob", officer.name);
    assert!(officer.married);
    assert_eq!(46, officer.age);
    

Dependencies

~1MB
~17K SLoC