12 releases (6 breaking)

0.7.1 Jul 1, 2024
0.6.1 Jun 21, 2024
0.4.0 Mar 26, 2024
0.2.0 Sep 4, 2021
0.1.0 Jan 31, 2020

#312 in Parser implementations

Download history 103/week @ 2024-08-17 143/week @ 2024-08-24 490/week @ 2024-08-31 280/week @ 2024-09-07 184/week @ 2024-09-14 368/week @ 2024-09-21 381/week @ 2024-09-28 678/week @ 2024-10-05 521/week @ 2024-10-12 661/week @ 2024-10-19 657/week @ 2024-10-26 475/week @ 2024-11-02 987/week @ 2024-11-09 895/week @ 2024-11-16 1441/week @ 2024-11-23 2097/week @ 2024-11-30

5,466 downloads per month
Used in 10 crates (4 directly)

MIT license

125KB
2.5K SLoC

Marked YAML

This library builds atop yaml-rust2 to provide a YAML AST which includes the marks for where the YAML data comes from. It explicitly operates at a low level, providing only the base safe YAML types (i.e. the vanilla tags tag:yaml.org,2002:seq, tag:yaml.org,2002:map, and tag:yaml.org,2002:str)

The subset of YAML which is supported is quite deliberately limited in order that users of this crate will implicitly discourage complex use of YAML which is harder to manage user expectations with. As an example, the mapping type in this crate explicitly only permits scalars as keys, and since all scalars are treated as strings, mappings always have string keys.

The primary value of this kind of representation of YAML data is to allow applications which want to be very explicit about where input came from an opportunity to do this in a way which normal YAML parsers do not allow.

Using Marked YAML

Currently this library only supports loading YAML from strings, but this is sufficient for most users' purposes. We would not recommend an un-streamed processing engine for massive data anyway.

To load some YAML you simply need to:

let node = marked_yaml::parse_yaml(0, r#"
toplevel: must be a mapping
but:
 - it
 - may
 - contain lists
and:
 mappings: are permitted
 as: sub-mappings
"#);
assert!(node.is_ok());

Parsing a valid YAML file may fail because marked_yaml adds some additional constraints:

  • The top level of the YAML MUST be one of a mapping or a sequence. This is controlled by the loader options.
  • Mapping keys MUST be scalars (strings).
  • Aliases and anchors MAY NOT be used (though this limit may be lifted in the future).

In addition, you can convert between marked_yaml::Node and yaml_rust::Yaml though doing so will not give you any useful markers.

Dependencies

~2.5MB
~38K SLoC