The ported engine wins every conflict: main's post-fork patches to the hand-rolled Scanner and TokenEventParser land on deleted files and are dropped; their behaviors are carried by the port and guarded by the whole-suite conformance gate (402/402 passing). Merge adaptations, all gates green (style, namespacing, forbidden patterns, changelog, roadmap, swiftformat, swiftlint strict, build, full test suite, whole-suite conformance sweep): - PureYAMLJSON representability rules move onto the Check algebra, replacing the retired legacy Rule type. - The permissive tag-handle pre-pass is removed; the port rejects an undefined handle at parse time (suite case QLJ7) and the validation report carries it as a parse diagnostic. - EventStreamComposer's nested types split one-per-file per the namespacing gate. - Tests pinned to old-engine behavior were re-verified against the reference and updated: libyaml rejects an explicit-key continuation ending at a value colon, and suite case QB6E requires rejecting a quoted continuation at column 0. - CHANGELOG unreleased entries from both lines are preserved in two groups with a provenance note. Closes #1, closes #3
36 lines
1.8 KiB
Swift
36 lines
1.8 KiB
Swift
import PureYAML
|
|
|
|
public extension PureYAML.JSON {
|
|
/// JSON-representability checks built on PureYAML's own validation framework.
|
|
/// The parser already guarantees the input is well-formed YAML (and so covers
|
|
/// JSON syntax); this layer reports the value-level reasons a tree cannot be
|
|
/// emitted as JSON: a non-string mapping key, a non-finite number, or (for a
|
|
/// deterministic single-meaning document) a duplicate key.
|
|
///
|
|
/// JSON the format tolerates duplicate object names, but a tree that carries two
|
|
/// pairs with the same key emits an ambiguous document, so the representability
|
|
/// validator rejects duplicates for determinism. Drop ``unique`` from the rule
|
|
/// set if you want the permissive reading.
|
|
enum Validator {
|
|
/// The full JSON-representability rule set: unique keys, string keys, finite
|
|
/// numbers. Suitable to pass straight to `PureYAML.JSON.Convert`.
|
|
public static var representability: PureYAML.Validation.Validator {
|
|
PureYAML.Validation.Validator(checks: [
|
|
PureYAML.Validation.AnyCheck(PureYAML.Validation.BuiltinCheck.mappingKeysAreUnique),
|
|
PureYAML.Validation.AnyCheck(PureYAML.Validation.BuiltinCheck.mappingKeysAreStrings),
|
|
PureYAML.Validation.AnyCheck(PureYAML.Validation.BuiltinCheck.numbersAreFinite),
|
|
])
|
|
}
|
|
|
|
/// Every reason the value cannot be emitted as strict JSON, in document order.
|
|
public static func issues(for value: PureYAML.Model.Value) -> [PureYAML.Validation.Issue] {
|
|
representability.collect(value).issues
|
|
}
|
|
|
|
/// Whether the value can be emitted as strict JSON.
|
|
public static func isRepresentable(_ value: PureYAML.Model.Value) -> Bool {
|
|
issues(for: value).isEmpty
|
|
}
|
|
}
|
|
}
|