PureYAML/scripts/validation-coverage.tsv
Mihaela M 2e45ecaffe feat(validation): add type-directed Check dispatch
Introduce the core of the validation-rules idiom: a Check<Subject> with a
positive description, a when predicate, and a Bool or multi-error check
that fires only on values of its Subject type wherever they occur. AnyCheck
erases the subject and dispatches by runtime type, guarding an optional or
a wrong type from matching. The validator gains a checks list, a
validating(_:) overload, and a traversal that offers each node the values
it may specialise on. BuiltinCheck.mappingKeysAreUnique is the
type-directed counterpart of the legacy rule.

The machinery has its own negative tests (wrong type, optional, false
predicate yield nothing; same type twice yields two errors) and the builtin
ships a failing and a near-miss test. The coverage gate catches the five
new public types, which are classified as validation machinery. The default
validator is unchanged, so this is additive; retiring the legacy Rule,
moving the default onto the check, the combinator algebra, the error
rendering, and de-duplicating the Tagged validator are the remaining steps.
2026-06-28 07:23:23 +02:00

89 lines
5.9 KiB
Plaintext

# Public-type validation coverage manifest (validation-rules.md).
# Every public type in the PureYAML target is classified exactly once.
# Columns (tab-separated): <fully.qualified.Type> <validated|excluded> <one-line reason>
# `validated`: carries a runtime invariant the type system does not enforce; backed by a
# Validation<Subject> in the framework phase.
# `excluded`: a caseless namespace, a closed sum type whose illegal states are unrepresentable,
# a pure data-transfer type, an error value, or engine/machinery that is not a validated subject.
# scripts/check-validation-coverage.sh fails the build if a public type is missing here or a line
# here is no longer public.
# --- namespaces (caseless enums) ---
PureYAML excluded caseless namespace; holds no instances or state
PureYAML.Decoding excluded caseless namespace; holds no instances or state
PureYAML.Emitting excluded caseless namespace; holds no instances or state
PureYAML.Encoding excluded caseless namespace; holds no instances or state
PureYAML.Model excluded caseless namespace; holds no instances or state
PureYAML.Parsing excluded caseless namespace; holds no instances or state
PureYAML.Stream excluded caseless namespace; holds no instances or state
PureYAML.Tagged excluded caseless namespace; holds no instances or state
PureYAML.Validation excluded caseless namespace; holds no instances or state
# --- model ---
PureYAML.Model.Value validated core YAML value; mapping-key uniqueness and merge/alias shape are runtime invariants
PureYAML.Model.Mapping validated mapping keys must be unique within a mapping
PureYAML.Model.Pair excluded data-transfer key/value pair; no invariant beyond its components
PureYAML.Model.Key excluded closed sum type (string/sequence/mapping); illegal states unrepresentable
# --- stream ---
PureYAML.Stream.Document excluded wraps a validated Model.Value plus an index; no own invariant
PureYAML.Stream.Issue excluded diagnostic data-transfer type
PureYAML.Stream.Issue.Collection excluded error aggregate; data-transfer
PureYAML.Stream.Result excluded diagnostic result data-transfer type
# --- parsing ---
PureYAML.Parsing.ParseError excluded error enum; cases are unrepresentable-illegal, carries diagnostics only
PureYAML.Parsing.Parser excluded parsing engine; produces values, is not itself a validated subject
# --- emitting ---
PureYAML.Emitting.Dumper excluded emitter engine; not a validated subject
PureYAML.Emitting.Options excluded emitter configuration; no cross-field invariant
PureYAML.Emitting.CollectionStyle excluded closed enum; illegal states unrepresentable
PureYAML.Emitting.ScalarStyle excluded closed enum; illegal states unrepresentable
# --- decoding / encoding (Codable machinery) ---
PureYAML.Decoding.Decoder excluded Codable decoding machinery; not a validated subject
PureYAML.Decoding.Error excluded error enum; data-transfer
PureYAML.Encoding.Encoder excluded Codable encoding machinery; not a validated subject
PureYAML.Encoding.Error excluded error enum; data-transfer
# --- tagged node subsystem ---
PureYAML.Tagged.Node validated tagged node tree; mapping-key uniqueness is a runtime invariant
PureYAML.Tagged.Mapping validated tagged mapping keys must be unique
PureYAML.Tagged.Pair excluded data-transfer key/value pair
PureYAML.Tagged.Scalar excluded data-transfer scalar (value + tag)
PureYAML.Tagged.Sequence excluded data-transfer ordered nodes
PureYAML.Tagged.Tag excluded data-transfer tag identifier
PureYAML.Tagged.NodeKind excluded closed enum; illegal states unrepresentable
PureYAML.Tagged.Document excluded wraps a validated Tagged.Node
PureYAML.Tagged.Context excluded construction context data-transfer type
PureYAML.Tagged.ConstructionContext excluded construction context data-transfer type
PureYAML.Tagged.ConstructionError excluded error enum; data-transfer
PureYAML.Tagged.Constructor excluded tag-construction engine; not a validated subject
PureYAML.Tagged.Rule excluded validation machinery; duplicates Validation.Rule, slated for de-dup (principle 10)
PureYAML.Tagged.Validator excluded validation machinery; duplicates Validation.Validator, slated for de-dup (principle 10)
# --- validation framework's own types ---
PureYAML.Validation.Validator excluded validation machinery; not a validated subject
PureYAML.Validation.Rule excluded the Validation<Subject> analog; a rule type, not a subject
PureYAML.Validation.Context excluded validation context passed to checks; not a subject
PureYAML.Validation.Issue excluded validation error data-transfer type
PureYAML.Validation.Issue.Collection excluded error aggregate; data-transfer
PureYAML.Validation.Result excluded validation result data-transfer type
PureYAML.Validation.Severity excluded closed enum; illegal states unrepresentable
PureYAML.Validation.Path excluded coding-path data-transfer type
PureYAML.Validation.Path.Component excluded coding-path element; closed enum
PureYAML.Validation.Report excluded diagnostic report data-transfer type
PureYAML.Validation.ReportError excluded error type; data-transfer
PureYAML.Validation.SourceReport excluded diagnostic report data-transfer type
PureYAML.Validation.Source excluded source descriptor data-transfer type
PureYAML.Validation.BatchReport excluded diagnostic report data-transfer type
PureYAML.Validation.Diagnostic excluded diagnostic data-transfer type
PureYAML.Validation.DiagnosticKind excluded closed enum; illegal states unrepresentable
PureYAML.Validation.PreflightScanner excluded pre-parse scanner engine; not a validated subject
PureYAML.Validation.Validatable excluded marker protocol constraining check subjects; no instances or state of its own
PureYAML.Validation.SubjectContext excluded read-only context passed to a type-directed check; not a subject
PureYAML.Validation.Check excluded the type-directed validation value (Validation<Subject> role); a rule, not a subject
PureYAML.Validation.AnyCheck excluded type-erased check; validation dispatch machinery
PureYAML.Validation.BuiltinCheck excluded caseless namespace of built-in checks