1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright 2015, Yuheng Chen.
// Copyright 2023, Ethiraric.
// See the LICENSE file at the top-level directory of this distribution.
//! YAML 1.2 parser implementation in pure Rust.
//!
//! `granit-parser` is a low-level event parser. It reads YAML input and yields a stream of
//! [`Event`] values paired with their source [`Span`].
//! Comments are emitted as [`Event::Comment`]. They are presentation metadata, not YAML data
//! nodes, so consumers building YAML value trees should ignore them.
//!
//! Add it to your project:
//!
//! ```sh
//! cargo add granit-parser
//! ```
//!
//! # Usage
//!
//! ```rust
//! use granit_parser::{Event, Parser, Placement};
//!
//! # fn main() -> Result<(), granit_parser::ScanError> {
//! let yaml = r#"# header
//! items: # inline
//! - milk
//! - bread
//! "#;
//! let mut comments = Vec::new();
//!
//! for next in Parser::new_from_str(yaml) {
//! let (event, span) = next?;
//! if let Event::Comment(text, placement) = event {
//! comments.push((
//! text.into_owned(),
//! placement,
//! span.slice(yaml).unwrap().to_owned(),
//! ));
//! }
//! }
//!
//! assert_eq!(
//! comments,
//! [
//! (" header".to_owned(), Placement::Above, "# header".to_owned()),
//! (" inline".to_owned(), Placement::Right, "# inline".to_owned()),
//! ]
//! );
//! # Ok(())
//! # }
//! ```
//!
//! For comment events, the companion [`Span`] covers the whole source comment, including `#` and
//! excluding the line break. With [`Parser::new_from_str`], [`Span::slice`] returns that source
//! comment text.
//!
//! # Limits
//!
//! [`Options`] controls comment emission and limits on buffered comments, simple-key lookahead,
//! directive retention, and flow- and block-collection nesting. Comment tokens and events are
//! emitted by default; setting [`Options::emit_comments`] to `false` recognizes and validates
//! comments without capturing their text or emitting them. The defaults allow 96 buffered comment
//! events, 1024 characters of simple-key lookahead, 1024 bytes of retained directive data, 16
//! reserved-directive parameters, 255 nested flow collections, and 255 nested block collections.
//! Existing constructors use these defaults.
//! [`Parser::new_from_str_with_options`], [`Parser::new_from_iter_with_options`],
//! [`Parser::new_from_fallible_iter_with_options`], [`Parser::with_options`],
//! [`Scanner::with_options`], and [`ParserStack::with_options`] accept customized options created
//! with [`options!`].
//!
//! # Features
//! **Note:** This crate's MSRV is `1.81.0`.
//!
//! #### `error_messages` (enabled by default)
//! Provides human-readable text through [`ErrorKind`]'s `Display` implementation and
//! [`ScanError::info`]. Disabling this feature makes both render an empty string while retaining
//! machine-readable error kinds and source markers.
//!
//! #### `std`
//! Retains the original `std::io::Error` inside [`InputIoError`] when constructed through
//! `InputIoError::from_io` or its `From<std::io::Error>` implementation. Without this feature,
//! [`InputIoError::from_message`] remains available for portable `no_std` error reporting.
//!
//! #### `debug_prints`
//! Enables the `debug` module and usage of debug prints in the scanner and the parser. Do not
//! enable if you are consuming the crate rather than working on it as this can significantly
//! decrease performance. Output remains opt-in behind a local compile-time toggle in
//! `src/debug.rs`.
//!
//! This feature does not raise the MSRV further.
//!
//! This feature enables `std` and is _not_ `no_std` compatible.
extern crate alloc;
extern crate std;
pub use crate;
pub use crate;
pub use crateOptions;
pub use crate;
pub use crate;
pub use crate;
// Keep every Rust example in the package README covered by `cargo test --doc` without duplicating
// the README in the rendered crate-level documentation.