PureYAML/Sources/Emitting/Dumper.Mapping.swift

64 lines
1.8 KiB
Swift

extension PureYAML.Emitting.Dumper {
func renderMapping(
_ mapping: PureYAML.Model.Mapping,
indent: Int,
) -> [String] {
mapping.pairs.flatMap { pair in
renderMappingPair(pair, indent: indent)
}
}
func renderMappingPair(
_ pair: PureYAML.Model.Pair,
indent: Int,
) -> [String] {
switch pair.keyNode {
case .mapping, .sequence:
renderComplexMappingPair(pair, indent: indent)
case .string:
renderStringKeyedMappingPair(pair, indent: indent)
}
}
func renderStringKeyedMappingPair(
_ pair: PureYAML.Model.Pair,
indent: Int,
) -> [String] {
let prefix = String(repeating: " ", count: indent)
switch pair.value {
case .mapping, .sequence:
return [prefix + escapeKey(pair.key) + ":"] + render(pair.value, indent: indent + 2)
default:
return renderMappingScalarPair(pair, indent: indent)
}
}
func renderComplexMappingPair(
_ pair: PureYAML.Model.Pair,
indent: Int,
) -> [String] {
let prefix = String(repeating: " ", count: indent)
return [prefix + "? " + pair.keyNode.flowDescription]
+ [prefix + ":"]
+ render(pair.value, indent: indent + 2)
}
func renderFlowMapping(_ mapping: PureYAML.Model.Mapping) -> String {
let pairs = mapping.pairs
.map { pair in
"\(renderFlowKey(pair.keyNode)): \(renderFlow(pair.value))"
}
.joined(separator: ", ")
return "{\(pairs)}"
}
func renderFlowKey(_ key: PureYAML.Model.Key) -> String {
switch key {
case .mapping, .sequence:
"? \(renderFlow(key.value))"
case let .string(value):
quote(value)
}
}
}