# Changelog
## v0.0.6
- Added `Tag::core_suffix` and made core-tag helpers match the resolved YAML 1.2.2
Core Schema tags (`null`, `bool`, `int`, `float`, `map`, `seq`, and `str`)
instead of checking only the resolved handle.
- Added `Span::indent` hints for non-empty block scalar content while leaving
whitespace-only block scalar spans unannotated.
## v0.0.5
- Performance improvements on comment parsing
- Added `Span::tag_start` metadata for parser-emitted tagged node events, so diagnostics can point
at the explicit tag token even when the node span starts on a later line.
- Added `Tag::original_handle`, `Tag::original_parts`, and `Tag::original` so consumers can inspect
the tag handle as written before `%TAG` directive resolution and reconstruct normalized
author-facing tag spelling, including verbatim tags (breaking change).
## v0.0.4
Retracted
## v0.0.3
- Added `Span::slice(&str)` for convenient source extraction from parser-emitted
spans when byte offsets are available.
- Added small `Tag` inspection helpers (`is_yaml_core_schema_tag`, `is_custom`,
`parts`) for YAML-core-namespace and non-core-namespace tag consumers.
- Added `Event` inspection helpers (`anchor_id`, `alias_id`, `tag`, `scalar`,
`is_node`) for ergonomic access to per-event node metadata. `anchor_id`
returns `Option<usize>` for events that define an anchor; `alias_id` returns
`Option<usize>` for aliases that reference an anchor; `is_node` returns `true`
for any event that produces a value in the document tree.
- Added comment events. Comments are emitted as parser
`Event::Comment(text, placement)` events with normal companion spans, and as
scanner comment tokens carrying `Placement` metadata. This is an event-stream
change: consumers building YAML data trees should ignore comment events, while
formatting/linting tools can use the placement hint and comment span.
- Added `StructureStyle` metadata for sequences and mappings, exposed on
`Event::SequenceStart(style, anchor_id, tag)` and
`Event::MappingStart(style, anchor_id, tag)` events.
- Added `ParserStack::push_include` as an include-oriented alias for
`ParserStack::resolve`.
- Added a custom-tag example showing how to inspect application tags such as
`!degrees` from the event stream.
- Added an include-stack example demonstrating `!include`-style resolution
through `ParserStack`.
- Updated the README minimal example to show `Span::slice` alongside byte
ranges.
- Fixed the span of quoted (single- and double-quoted) scalars to end at the
closing quote rather than after trailing whitespace and an optional
end-of-line comment. This makes `Span::slice` return only the scalar source.
- Fixed pedantic Clippy warnings and switched into pedantic mode.
## v0.0.2
**Features**:
- Added `TryEventReceiver`, `TrySpannedEventReceiver`, `TryLoadError`,
`Parser::try_load`, and `ParserTrait::try_load` for receiver-style parsing
that can fail fast with an application error. The existing `load` API remains
unchanged for infallible receivers.
## v0.0.1
Initial `granit-parser` release after splitting the parser into its own
standalone package.
**Breaking Changes**:
- Renamed the package to `granit-parser` and the Rust crate path to
`granit_parser`.
- Raised MSRV to `1.81.0`.
- Made the library `no_std` by default, with `alloc` enabled internally.
- Changed parser events, scanner tokens, receivers, and parse-result aliases to
carry an input lifetime.
- Changed scalar, tag, anchor, alias, and tag-directive payloads to use
`Cow<'input, ...>` so `&str` input can avoid allocations.
- Renamed `TScalarStyle` to `ScalarStyle`.
- Changed `Marker::index()` and error messages to report character positions.
Byte positions are now optional and available through `Marker::byte_offset()`
and `Span::byte_range()`.
- Added `Span::indent` for parser-emitted indentation hints.
- `debug_prints` no longer reads environment variables. Debug output is now
controlled by the feature and a local compile-time toggle in `src/debug.rs`.
**Features**:
- Added `BorrowedInput` and byte-slicing support for inputs that can safely
borrow from stable source storage.
- Added zero-copy scanning for `StrInput` across plain scalars, quoted scalars,
anchors, aliases, tags, and tag directives when no decoding is needed.
- Added `Parser::new_from_iter` as the iterator-backed constructor.
- Added `ParserTrait`, `ParserStack`, and `ReplayParser` for stacked parser
workflows and replayed event streams.
- Added anchor offset management for stacked/replayed parser use cases.
- Added `Tag::is_yaml_core_schema()` and `Display` for `Tag`.
- Exported the input module and scanner/token types needed by downstream tools.
**Fixes**:
- Reject unclosed and misplaced flow brackets with diagnostics pointing at the
relevant opening or closing marker.
- Reject unclosed quoted scalars with an `unclosed quote` diagnostic.
- Reject comment-interrupted multiline plain scalars instead of silently
truncating the scalar.
- Handle reserved directives according to YAML rules while still rejecting
malformed `%YAML` directives.
- Handle JSON-style surrogate pairs in quoted scalars and reject unpaired,
reversed, or invalid surrogate escapes.
- Fix several flow mapping and flow sequence edge cases, including empty
implicit keys and nested implicit mappings.
- Fix plain-scalar handling around `---`, `...`, `:`, `-`, tabs, and flow
indicators.
- Fix block scalar indentation, chomping, kept trailing lines, tabs in scalar
bodies, and non-ASCII span accounting.
- Fix document marker spans so `---` and `...` are emitted at the marker that
triggered them.
- Fix spans for empty scalars, null values, mapping keys, non-ASCII input,
comments, and block scalars.
- Avoid parser hangs and panic paths found by regression and fuzz tests.
**Performance**:
- Added fast ASCII paths for `StrInput`.
- Added chunked plain-scalar scanning and faster comment skipping.
- Switched several small parser/scanner stacks from `Vec` to `smallvec`.
**Build and Package**:
- Made the root crate standalone instead of relying on workspace-inherited
package metadata.
- Removed unused root dependencies and dev-dependencies, including the old
high-level YAML loader, `hashlink`, `miette`, `quickcheck`, `rustyline`, and
`thiserror`.
- Added `smallvec` and disabled default features for `arraydeque`.
- Forbid unsafe code through crate attributes and Cargo lints.
- Renamed root tool binaries to `time_parser` and `run_parser`.
**Tests and CI**:
- Updated tests to use `granit_parser` and the lifetime/Cow-based event API.
- Run parser regression tests against both `StrInput` and `BufferedInput`.
- Replaced the YAML test-suite loader with a local fixture reader so the root
crate no longer needs a high-level YAML parser as a dev-dependency.
- Added regression coverage for flow brackets, comments, document markers,
block scalars, indentation hints, tabs, plain scalar indicators, surrogate
escapes, non-ASCII positions, parser stacks, and fuzz-discovered inputs.
- Added a README example regression test.
- Added CI coverage for clippy, formatting, host library tests without default
features, and `wasm32v1-none` `no_std` library checks.
**Documentation and Tools**:
- Rewrote crate docs and README examples for `granit-parser`.
- Added README coverage for repository tools.
- Added the standalone `tools/walk` helper crate for navigating parsed YAML
spans.
## v0.0.6
**Fixes**:
- Fix emitting of tags with empty handles. `!tag` no longer emits as `!!tag`.
## v0.0.5
**Breaking Changes**:
- Emit `Cow<'input, Tag>` instead of `Tag` to avoid copies.
**Fixes**:
- 8ef76dcc: Fix `Marker`s for `null` and empty values.
- Fix `Span`s for collections to correctly mark the end of the collection.
**Changes**
- Exclude `yaml-test-suite` from the Cargo package.
- Bump `libtest-mimic` to `0.8.1`.
## v0.0.4
**Breaking Changes**:
- Allow events to borrow from the input.
- Rename `TScalarStyle` to `ScalarStyle`.
## v0.0.3
**Breaking Changes**:
- 926fdfb: Events now use spans rather than markers, allowing for tracking both
the beginning and the end of scalars.
- 6c57b5b: Add a boolean to `DocumentStart` to know whether the start was
explicit (`---`) or implicit.
**Features**:
- Add an `Input` interface to prepare the ground to future input-specific.
optimizations (such as returning `Cow`'d strings when possible). This also
potentially allows for user-defined optimizations.
- Add `Parser::new_from_iter` to load from an iterator. This automatically
wraps using `BufferedInput`, which implements the new `Input` trait the
`Parser` needs.
**Fixes**:
- 750c992: Add support for nested implicit flow mappings.
- 11cffc6: Fix error with deeply indented block scalars.
- d3b9641: Fix assertion that could erroneously trigger with multibyte
characters.
- 95fe3fe: Fix parse errors when `---` appeared in the middle of plain scalars.
- 3358629: Fix infinite loop with `...` in plain scalars in flow contexts.
- Fix panics on other various erroneous inputs found while fuzzing.
**Internal changes**:
- Run all tests with both `Input` backends
- #15: Add fuzzing
## v0.0.2
This release does not provide much but is needed for the `saphyr` library to
depend on the new features.
**Breaking Changes**:
**Features**:
- Add `Marker::default()`
- Rework string handling in `ScanError`
**Fixes**:
- [yaml-rust2 #21](https://github.com/Ethiraric/yaml-rust2/issues/21#issuecomment-2053513507)
Fix parser failing when a comment immediately follows a tag.
**Internal changes**:
- Various readability improvements and code cleanups