PureYAML/Sources/Tagged/Tagged.CollectionStyle.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

24 lines
683 B
Swift

public extension PureYAML.Tagged {
/// The presentation style a collection had in the source document, or the
/// style a caller wants a collection to take on output. `nil` on a node
/// means "no per-node preference": the emitter's document-wide policy
/// decides.
enum CollectionStyle: String, Equatable, Sendable, CustomStringConvertible {
case block
case flow
public var description: String {
rawValue
}
}
}
extension PureYAML.Tagged.CollectionStyle {
init(_ style: PureYAML.Parsing.CollectionStyle) {
self = switch style {
case .block: .block
case .flow: .flow
}
}
}