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
29 lines
940 B
Swift
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
|
|
}
|
|
}
|
|
}
|