PureXML/Sources/Parsing
Mihaela Mihaljevic b1d82e533d feat(parsing): recovering reader that never crashes on invalid input
Slice 2 of #92. Add PureXML.read, a deterministic recovering reader: it never
throws and never traps, returning the maximal best-effort tree plus one located
Diagnostic per problem.

- ReadResult { node, diagnostics } is the Equatable result type, so a
  deterministic read can be compared whole.
- Diagnostic carries a message and a structured source Mark; a thrown ParseError
  maps to one directly (ParseError.mark exposes the position each case carries).
- The reader resynchronizes after a failure (EventReader.recover(from:)):
  progress-aware, so a failure that already consumed the bad construct retries
  from there, while a stuck failure skips to the next markup start; it always
  advances when input remains, guaranteeing termination.
- The tree builder assembles leniently: elements left open by truncation are
  closed, an end tag with no open element is dropped. Well-formed input yields
  exactly parse(_:)'s tree with no diagnostics.

Tests pin exact trees and diagnostics for truncation, mismatched tags, and stray
junk, prove determinism (same bytes give an identical ReadResult), and fuzz 400
seeded inputs (arbitrary plus truncated valid docs) asserting no crash.

Recovery here is resync-based; finer in-reader recovery (keep the element on a
duplicate attribute, pop to a matching open tag) is the next slice.
2026-06-08 12:15:18 +02:00
..
ByteDecoder.swift feat(parsing): full encoding support (UTF-32, ISO-8859-1, Windows-1252) 2026-06-08 02:39:25 +02:00
Diagnostic.swift feat(parsing): recovering reader that never crashes on invalid input 2026-06-08 12:15:18 +02:00
DoctypeScanner.swift feat(dtd): external and parameter entities, secure by default 2026-06-08 03:08:20 +02:00
DocumentType.swift feat(dtd): external and parameter entities, secure by default 2026-06-08 03:08:20 +02:00
EntityDecoder.swift feat(parser): optional DTD with internal entities and billion-laughs defense 2026-06-08 01:17:09 +02:00
EntityResolver.swift feat(dtd): external and parameter entities, secure by default 2026-06-08 03:08:20 +02:00
Event.swift feat(parser): add a streaming, iterative XML parser 2026-06-08 00:10:50 +02:00
EventReader.swift feat(parsing): recovering reader that never crashes on invalid input 2026-06-08 12:15:18 +02:00
ExternalID.swift feat(dtd): external and parameter entities, secure by default 2026-06-08 03:08:20 +02:00
InputEncoding.swift feat(parsing): full encoding support (UTF-32, ISO-8859-1, Windows-1252) 2026-06-08 02:39:25 +02:00
Limits.swift feat(parser): optional DTD with internal entities and billion-laughs defense 2026-06-08 01:17:09 +02:00
Mark.swift chore: scaffold PureXML pure-Swift XML package 2026-06-07 23:20:20 +02:00
NamespaceContext.swift feat(parser): resolve XML namespaces at the start-element boundary 2026-06-08 01:03:29 +02:00
ParseError.swift feat(parser): optional DTD with internal entities and billion-laughs defense 2026-06-08 01:17:09 +02:00
Parser.swift feat(parsing): recovering reader that never crashes on invalid input 2026-06-08 12:15:18 +02:00
PushAsync.swift feat(parsing): resumable push / feed streaming API 2026-06-08 07:21:22 +02:00
PushParser.swift feat(parsing): resumable push / feed streaming API 2026-06-08 07:21:22 +02:00
PushScanner.swift feat(parsing): resumable push / feed streaming API 2026-06-08 07:21:22 +02:00
Reader.swift feat(parsing): spec-exact XML character classification (chvalid parity) 2026-06-08 02:52:42 +02:00
ReadResult.swift feat(parsing): recovering reader that never crashes on invalid input 2026-06-08 12:15:18 +02:00
SAXHandler.swift feat(parsing): add SAX2 push-callback API 2026-06-08 02:26:04 +02:00
StreamingDecoder.swift feat(parsing): full encoding support (UTF-32, ISO-8859-1, Windows-1252) 2026-06-08 02:39:25 +02:00
TextReader.swift feat(parse): xmlTextReader pull cursor 2026-06-08 03:18:00 +02:00
XMLCharacter.swift feat(parsing): spec-exact XML character classification (chvalid parity) 2026-06-08 02:52:42 +02:00