PureYAML/Sources/Tagged/Tagged.Mapping.swift
Mihaela Mihaljevic 2a84d6616f feat(tagged): preserve anchors, aliases, and per-node styles end to end
Tagged.Scalar/Sequence/Mapping gain anchor and style fields
(Tagged.ScalarStyle, Tagged.CollectionStyle), Tagged.Node gains an
alias(anchor:node:) case carrying both the reference and its resolution,
and parseTagged populates all of it from the parse events instead of
discarding anchors and expanding aliases into copies.

PureYAML.dump(_ node: Tagged.Node, options:) re-emits anchors, alias
references, tags, and per-node styles over the document-wide policy.
Plain scalars re-emit their source spelling (NO stays NO, an empty null
stays empty); literal blocks cover keep chomping, single-line strip
chomping, leading blank lines, and whitespace-led first lines via an
explicit indentation indicator; folded scalars re-emit as > when the
folding rules invert exactly and degrade to a literal block otherwise.

The round-trip law parseTagged(dump(parseTagged(d))) == parseTagged(d)
is corpus-tested over every real-world fixture, with one documented
degradation: single-quoted content containing line breaks re-emits
double-quoted, value unchanged.

Closes #9
2026-07-12 13:20:12 +02:00

29 lines
940 B
Swift

public extension PureYAML.Tagged {
struct Mapping: Equatable, Sendable {
public var pairs: [Pair]
public var tag: Tag?
/// The `&name` anchor on this mapping in the source document, or the
/// anchor to attach on output. `nil` when the node is unanchored.
public var anchor: String?
/// The mapping's presentation style. Populated from the source on
/// parse; `nil` on hand-built nodes that have no style preference.
public var style: CollectionStyle?
public init(
pairs: [Pair],
tag: Tag? = nil,
anchor: String? = nil,
style: CollectionStyle? = nil,
) {
self.pairs = pairs
self.tag = tag
self.anchor = anchor
self.style = style
}
public subscript(_ key: String) -> Node? {
pairs.first { $0.key == key }?.value
}
}
}