PureYAML/Sources/Validation/Rule.Builtins.swift

42 lines
1.3 KiB
Swift

public extension PureYAML.Validation.Rule {
/// Reports duplicate keys in any mapping.
static var mappingKeysAreUnique: Self {
Self(description: "Mapping keys are unique") { context in
guard case let .mapping(mapping) = context.subject else {
return []
}
var seen = Set<PureYAML.Model.Key>()
var issues: [PureYAML.Validation.Issue] = []
for pair in mapping.pairs {
if seen.insert(pair.keyNode).inserted {
continue
} else {
issues.append(PureYAML.Validation.Issue(
severity: .error,
reason: "Duplicate mapping key '\(pair.keyNode.description)'",
path: context.path.appending(pair.keyNode.pathComponent),
))
}
}
return issues
} when: { context in
if case .mapping = context.subject {
return true
}
return false
}
}
}
extension PureYAML.Model.Key {
var pathComponent: PureYAML.Validation.Path.Component {
switch self {
case let .string(value):
.key(value)
case .mapping, .sequence:
.complexKey(self)
}
}
}