PureYAML/docs/rules/validation.md

2.9 KiB

Validation Rules

Rules for writing PureYAML validators and validation tests.

Core Rule

A validator is a diagnostic contract, not just a throwing function. Every new validation rule must make these parts explicit:

  • Subject: the YAML value shape the rule inspects.
  • Predicate: the condition under which the rule runs. Use when for optional or context-specific checks instead of hiding that logic in the issue body.
  • Context: use root, subject, and path deliberately. If a rule needs document-wide knowledge, read it from root; if it only needs the current node, read it from subject.
  • Issue contract: return path-aware Issue values with exact severity, reason, and path. Do not report anonymous failures.
  • Path contract: diagnostic paths must be unambiguous. Simple identifier keys may use dot paths; every key containing punctuation, whitespace, quotes, slashes, dots, or an empty string must render with bracket-quoted escaping.
  • Default status: state whether the rule belongs in Validation.Validator.defaultRules or must be opt-in.

Validation Document Rule

User-facing tools must offer a validation document/report instead of exposing only a raw crash, trap, stack trace, or unstructured thrown error. Library APIs may throw typed errors, but CLIs, batch tools, and corpus runners must be able to write or print a readable validation document that includes:

  • input URL or file path;
  • failure category;
  • line and column when available;
  • failing reference or path when applicable;
  • original error text;
  • whether processing continued or stopped.

Input-level failures must be data. A tool may return a non-zero exit code after reporting failures, but it must not silently drop them or terminate before the validation document can be produced.

Test Contract

Every validator change must include Swift Testing coverage for:

  • a document that succeeds and returns no issues;
  • a document that fails with exact issue values;
  • a case where the predicate prevents the rule from running;
  • required presence and required absence checks, so false positives are caught;
  • exact traversal order when multiple issues are possible;
  • strict and non-strict behavior when the rule can emit warnings;
  • exact thrown Issue.Collection contents for failure cases.
  • direct Model.Value validation for YAML states that ordinary loaders may collapse or reject, such as duplicate keys and punctuation-heavy keys.

Implementation Rules

  • Keep rules as immutable values under PureYAML.Validation.Rule.
  • Prefer a when predicate over early-returning inside the rule body when the rule only applies to a subset of nodes.
  • Keep built-in rules deterministic and allocation-conscious. Use sets or maps for membership checks instead of repeated linear scans.
  • Do not add external dependencies, Foundation, C shims, or platform-specific code to validation.
  • Do not make validation mutate parsed values. Validation observes and reports.