Tokenized Errors

For JSON and YAML content, TypeSystem can provide error messages with position indicators showing exactly where the error occurred in the raw textual content.

import typesystem


config_schema = typesystem.Schema(
    fields={
        "num_worker_processes": typesystem.Integer(),
        "enable_auto_reload": typesystem.Boolean(),
    }
)

text = '''{
    "num_worker_processes": "x",
    "enable_auto_reload": "true"
}'''

try:
    typesystem.validate_json(text, validator=config_schema)
except (typesystem.ValidationError, typesystem.ParseError) as exc:
    for message in exc.messages():
        line_no = message.start_position.line_no
        column_no = message.start_position.column_no
        print(f"Error {message.text!r} at line {line_no}, column {column_no}.")
# Error 'Must be a number.' at line 2, column 29.

The two functions for parsing content and providing positional error messages are:

  • validate_json(text_or_bytes, validator)
  • validate_yaml(text_or_bytes, validator)

In both cases validator may either be a Schema or a Field instance.