Blaze 0.0.1
The ultra high-performance JSON Schema evaluator
Loading...
Searching...
No Matches
AlterSchema

A growing collection of JSON Schema transformation rules. More...

Classes

class  sourcemeta::blaze::SchemaRule
class  sourcemeta::blaze::SchemaRuleMissingNameError
class  sourcemeta::blaze::SchemaRuleInvalidNameError
class  sourcemeta::blaze::SchemaRuleInvalidNamePatternError
class  sourcemeta::blaze::SchemaAbortError
class  sourcemeta::blaze::SchemaBrokenReferenceError
class  sourcemeta::blaze::SchemaTransformRuleProcessedTwiceError
class  sourcemeta::blaze::SchemaTransformRule
class  sourcemeta::blaze::SchemaTransformer

Enumerations

enum class  sourcemeta::blaze::AlterSchemaMode : std::uint8_t { AlterSchemaMode::Linter }

Functions

SOURCEMETA_BLAZE_ALTERSCHEMA_EXPORT auto sourcemeta::blaze::add (SchemaTransformer &bundle, const AlterSchemaMode mode) -> void
SOURCEMETA_BLAZE_ALTERSCHEMA_EXPORT auto sourcemeta::blaze::wrap (const sourcemeta::core::JSON &schema, const sourcemeta::core::SchemaFrame &frame, const sourcemeta::core::SchemaFrame::Location &location, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver, sourcemeta::core::WeakPointer &base) -> sourcemeta::core::JSON

Detailed Description

A growing collection of JSON Schema transformation rules.

This functionality is included as follows:

#include <sourcemeta/blaze/alterschema.h>

Class Documentation

◆ sourcemeta::blaze::SchemaRule

class sourcemeta::blaze::SchemaRule

A linter rule driven by a JSON Schema. By default, every subschema in the document under inspection is validated as a JSON instance against the provided rule schema, though a rule may be scoped to only run against the document root. When a subschema does not conform, the rule fires and reports the validation errors. The rule name is extracted from the title keyword of the rule schema, and the rule description from the description keyword. The title must consist only of lowercase ASCII letters, digits, underscores, or slashes.

Inheritance diagram for sourcemeta::blaze::SchemaRule:
sourcemeta::blaze::SchemaTransformRule

Public Types

enum class  Scope : std::uint8_t { All , TopLevel }
 The locations of the schema that the rule applies to. More...
using mutates = std::false_type
using reframe_after_transform = std::false_type

Public Member Functions

 SchemaRule (const sourcemeta::core::JSON &schema, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver, const Compiler &compiler, const std::string_view default_dialect="", const std::optional< Tweaks > &tweaks=std::nullopt, const Scope scope=Scope::All)
auto condition (const sourcemeta::core::JSON &, const sourcemeta::core::JSON &, const sourcemeta::core::SchemaVocabularies &, const sourcemeta::core::SchemaFrame &, const sourcemeta::core::SchemaFrame::Location &, const sourcemeta::core::SchemaWalker &, const sourcemeta::core::SchemaResolver &) const -> SchemaTransformRule::Result override
Public Member Functions inherited from sourcemeta::blaze::SchemaTransformRule
 SchemaTransformRule (const std::string_view name, const std::string_view message)
 SchemaTransformRule (const SchemaTransformRule &)=delete
 SchemaTransformRule (SchemaTransformRule &&)=delete
auto operator= (const SchemaTransformRule &) -> SchemaTransformRule &=delete
auto operator= (SchemaTransformRule &&) -> SchemaTransformRule &=delete
auto operator== (const SchemaTransformRule &other) const -> bool
 Compare a rule against another rule.
auto name () const noexcept -> std::string_view
 Fetch the name of a rule.
auto message () const noexcept -> std::string_view
 Fetch the message of a rule.
auto check (const sourcemeta::core::JSON &schema, const sourcemeta::core::JSON &root, const sourcemeta::core::SchemaVocabularies &vocabularies, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver, const sourcemeta::core::SchemaFrame &frame, const sourcemeta::core::SchemaFrame::Location &location, const sourcemeta::core::JSON::String &exclude_keyword) const -> Result
 Check if the rule applies to a schema.
virtual auto rereference (const std::string_view reference, const sourcemeta::core::Pointer &origin, const sourcemeta::core::Pointer &target, const sourcemeta::core::Pointer &current) const -> sourcemeta::core::Pointer
virtual auto condition (const sourcemeta::core::JSON &schema, const sourcemeta::core::JSON &root, const sourcemeta::core::SchemaVocabularies &vocabularies, const sourcemeta::core::SchemaFrame &frame, const sourcemeta::core::SchemaFrame::Location &location, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver) const -> Result=0
 The rule condition.
virtual auto transform (sourcemeta::core::JSON &schema, const Result &result) const -> void

Member Enumeration Documentation

◆ Scope

enum class sourcemeta::blaze::SchemaRule::Scope : std::uint8_t
strong

The locations of the schema that the rule applies to.

Enumerator
All 

Every subschema of the document under inspection.

TopLevel 

Only the document root.

◆ sourcemeta::blaze::SchemaRuleMissingNameError

class sourcemeta::blaze::SchemaRuleMissingNameError

An error that represents a missing schema rule name

Inheritance diagram for sourcemeta::blaze::SchemaRuleMissingNameError:

Public Member Functions

auto what () const noexcept -> const char *override

◆ sourcemeta::blaze::SchemaRuleInvalidNameError

class sourcemeta::blaze::SchemaRuleInvalidNameError

An error that represents an invalid schema rule name. The name must consist only of lowercase ASCII letters, digits, underscores, or slashes.

Inheritance diagram for sourcemeta::blaze::SchemaRuleInvalidNameError:

Public Member Functions

 SchemaRuleInvalidNameError (const std::string_view identifier, const char *message)
 SchemaRuleInvalidNameError (const std::string_view identifier, std::string message)=delete
 SchemaRuleInvalidNameError (const std::string_view identifier, std::string &&message)=delete
 SchemaRuleInvalidNameError (const std::string_view identifier, std::string_view message)=delete
auto what () const noexcept -> const char *override
auto identifier () const noexcept -> const std::string &

◆ sourcemeta::blaze::SchemaRuleInvalidNamePatternError

class sourcemeta::blaze::SchemaRuleInvalidNamePatternError

An error that represents a schema rule name that does not match the required pattern

Inheritance diagram for sourcemeta::blaze::SchemaRuleInvalidNamePatternError:

Public Member Functions

 SchemaRuleInvalidNamePatternError (const std::string_view identifier, const std::string_view regex)
auto what () const noexcept -> const char *override
auto identifier () const noexcept -> const std::string &
auto regex () const noexcept -> const std::string &

◆ sourcemeta::blaze::SchemaAbortError

class sourcemeta::blaze::SchemaAbortError

An error that represents that a schema operation cannot continue

Inheritance diagram for sourcemeta::blaze::SchemaAbortError:

Public Member Functions

 SchemaAbortError (const char *message)
 SchemaAbortError (std::string message)=delete
 SchemaAbortError (std::string &&message)=delete
 SchemaAbortError (std::string_view message)=delete
auto what () const noexcept -> const char *override

◆ sourcemeta::blaze::SchemaBrokenReferenceError

class sourcemeta::blaze::SchemaBrokenReferenceError

An error that represents a broken schema reference after transformation

Inheritance diagram for sourcemeta::blaze::SchemaBrokenReferenceError:

Public Member Functions

 SchemaBrokenReferenceError (const std::string_view identifier, sourcemeta::core::Pointer schema_location, const char *message)
auto what () const noexcept -> const char *override
auto identifier () const noexcept -> std::string_view
auto location () const noexcept -> const sourcemeta::core::Pointer &

◆ sourcemeta::blaze::SchemaTransformRuleProcessedTwiceError

class sourcemeta::blaze::SchemaTransformRuleProcessedTwiceError

An error that signifies that a transform rule was applied more than once

Inheritance diagram for sourcemeta::blaze::SchemaTransformRuleProcessedTwiceError:

Public Member Functions

 SchemaTransformRuleProcessedTwiceError (const std::string_view name, sourcemeta::core::Pointer location)
auto what () const noexcept -> const char *override
auto name () const noexcept -> std::string_view
auto location () const noexcept -> const sourcemeta::core::Pointer &

◆ sourcemeta::blaze::SchemaTransformRule

class sourcemeta::blaze::SchemaTransformRule

A class that represents a transformation rule. Clients of this class are expected to subclass and implement their own condition and transformation methods.

Inheritance diagram for sourcemeta::blaze::SchemaTransformRule:
sourcemeta::blaze::SchemaRule

Public Member Functions

 SchemaTransformRule (const std::string_view name, const std::string_view message)
 SchemaTransformRule (const SchemaTransformRule &)=delete
 SchemaTransformRule (SchemaTransformRule &&)=delete
auto operator= (const SchemaTransformRule &) -> SchemaTransformRule &=delete
auto operator= (SchemaTransformRule &&) -> SchemaTransformRule &=delete
auto operator== (const SchemaTransformRule &other) const -> bool
 Compare a rule against another rule.
auto name () const noexcept -> std::string_view
 Fetch the name of a rule.
auto message () const noexcept -> std::string_view
 Fetch the message of a rule.
auto check (const sourcemeta::core::JSON &schema, const sourcemeta::core::JSON &root, const sourcemeta::core::SchemaVocabularies &vocabularies, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver, const sourcemeta::core::SchemaFrame &frame, const sourcemeta::core::SchemaFrame::Location &location, const sourcemeta::core::JSON::String &exclude_keyword) const -> Result
 Check if the rule applies to a schema.
virtual auto rereference (const std::string_view reference, const sourcemeta::core::Pointer &origin, const sourcemeta::core::Pointer &target, const sourcemeta::core::Pointer &current) const -> sourcemeta::core::Pointer
virtual auto condition (const sourcemeta::core::JSON &schema, const sourcemeta::core::JSON &root, const sourcemeta::core::SchemaVocabularies &vocabularies, const sourcemeta::core::SchemaFrame &frame, const sourcemeta::core::SchemaFrame::Location &location, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver) const -> Result=0
 The rule condition.
virtual auto transform (sourcemeta::core::JSON &schema, const Result &result) const -> void

Member Function Documentation

◆ rereference()

virtual auto sourcemeta::blaze::SchemaTransformRule::rereference ( const std::string_view reference,
const sourcemeta::core::Pointer & origin,
const sourcemeta::core::Pointer & target,
const sourcemeta::core::Pointer & current ) const->sourcemeta::core::Pointer
nodiscardvirtual

A method to optionally fix any reference location that was affected by the transformation

◆ transform()

virtual auto sourcemeta::blaze::SchemaTransformRule::transform ( sourcemeta::core::JSON & schema,
const Result & result ) const->void
virtual

The rule transformation. If this virtual method is not overriden, then the rule is considered to not mutate the schema

◆ sourcemeta::blaze::SchemaTransformer

class sourcemeta::blaze::SchemaTransformer

You can use this class to perform top-down transformations on subschemas given a set of rules. Every registered rule is applied to every subschema of the passed schema until no longer of them applies.

Public Types

using Callback
 The callback that is called whenever the condition of a rule holds true.
using Framer

Public Member Functions

template<std::derived_from< SchemaTransformRule > T, typename... Args>
auto add (Args &&...args) -> std::string_view
auto remove (const std::string_view name) -> bool
 Remove a rule from the bundle.
auto apply (sourcemeta::core::JSON &schema, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver, const Callback &callback, std::string_view default_dialect="", std::string_view default_id="", const sourcemeta::core::JSON::String &exclude_keyword="") const -> std::pair< bool, std::uint8_t >
 Apply the bundle of rules to a schema.
auto apply (sourcemeta::core::JSON &document, const Framer &framer, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver, const Callback &callback, const sourcemeta::core::JSON::String &exclude_keyword="") const -> std::pair< bool, std::uint8_t >
auto check (const sourcemeta::core::JSON &schema, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver, const Callback &callback, std::string_view default_dialect="", std::string_view default_id="", const sourcemeta::core::JSON::String &exclude_keyword="") const -> std::pair< bool, std::uint8_t >
auto check (const sourcemeta::core::JSON &document, const sourcemeta::core::SchemaFrame &frame, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver, const Callback &callback, const sourcemeta::core::JSON::String &exclude_keyword="") const -> std::pair< bool, std::uint8_t >
auto begin () const -> auto
auto end () const -> auto

Member Typedef Documentation

◆ Callback

Initial value:
std::function<void(
const sourcemeta::core::Pointer &, const std::string_view,
const std::string_view, const SchemaTransformRule::Result &, const bool)>
The result of evaluating a rule.
Definition alterschema_transformer.h:56

The callback that is called whenever the condition of a rule holds true.

◆ Framer

Initial value:
std::function<const sourcemeta::core::SchemaFrame &(
const sourcemeta::core::JSON &)>

Frame a document as it currently stands, in References mode. Applying rules calls it again whenever a transformation needs a new frame, so the frame it returns only has to remain valid until the next call

Member Function Documentation

◆ add()

template<std::derived_from< SchemaTransformRule > T, typename... Args>
auto sourcemeta::blaze::SchemaTransformer::add ( Args &&... args) ->std::string_view
inline

Add a rule to the bundle. Rules are evaluated in the order they are added. It is the caller's responsibility to not add duplicate rules.

◆ apply()

auto sourcemeta::blaze::SchemaTransformer::apply ( sourcemeta::core::JSON & document,
const Framer & framer,
const sourcemeta::core::SchemaWalker & walker,
const sourcemeta::core::SchemaResolver & resolver,
const Callback & callback,
const sourcemeta::core::JSON::String & exclude_keyword = "" ) const->std::pair< bool, std::uint8_t >
nodiscard

Apply the bundle of rules to every subschema that a framer locates within a document

◆ check() [1/2]

auto sourcemeta::blaze::SchemaTransformer::check ( const sourcemeta::core::JSON & document,
const sourcemeta::core::SchemaFrame & frame,
const sourcemeta::core::SchemaWalker & walker,
const sourcemeta::core::SchemaResolver & resolver,
const Callback & callback,
const sourcemeta::core::JSON::String & exclude_keyword = "" ) const->std::pair< bool, std::uint8_t >
nodiscard

Report back the rules from the bundle that need to be applied to every subschema that a frame locates within a document

◆ check() [2/2]

auto sourcemeta::blaze::SchemaTransformer::check ( const sourcemeta::core::JSON & schema,
const sourcemeta::core::SchemaWalker & walker,
const sourcemeta::core::SchemaResolver & resolver,
const Callback & callback,
std::string_view default_dialect = "",
std::string_view default_id = "",
const sourcemeta::core::JSON::String & exclude_keyword = "" ) const->std::pair< bool, std::uint8_t >
nodiscard

Report back the rules from the bundle that need to be applied to a schema

Enumeration Type Documentation

◆ AlterSchemaMode

enum class sourcemeta::blaze::AlterSchemaMode : std::uint8_t
strong

The category of a built-in transformation rule

Enumerator
Linter 

Rules that simplify the given schema for both human readability and performance

Function Documentation

◆ add()

SOURCEMETA_BLAZE_ALTERSCHEMA_EXPORT auto sourcemeta::blaze::add ( SchemaTransformer & bundle,
const AlterSchemaMode mode )->void

Add a set of built-in schema transformation rules given a category. For example:

#include <sourcemeta/core/jsonschema.h>
#include <sourcemeta/blaze/alterschema.h>
auto schema = sourcemeta::core::parse_json(R"JSON({
"$schema": "https://json-schema.org/draft/2020-12/schema",
"foo": 1,
"items": {
"type": "string",
"foo": 2
}
})JSON");
const auto result{bundle.apply(schema,
sourcemeta::core::schema_walker,
sourcemeta::core::schema_resolver,
[](const auto &pointer,
const auto &name,
const auto &message,
const auto &outcome,
const auto dismissed) {
// Do something with the information
})};
auto apply(sourcemeta::core::JSON &schema, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver, const Callback &callback, std::string_view default_dialect="", std::string_view default_id="", const sourcemeta::core::JSON::String &exclude_keyword="") const -> std::pair< bool, std::uint8_t >
Apply the bundle of rules to a schema.
Definition alterschema_transformer.h:142
SOURCEMETA_BLAZE_ALTERSCHEMA_EXPORT auto add(SchemaTransformer &bundle, const AlterSchemaMode mode) -> void
@ Linter
Definition alterschema.h:42

◆ wrap()

SOURCEMETA_BLAZE_ALTERSCHEMA_EXPORT auto sourcemeta::blaze::wrap ( const sourcemeta::core::JSON & schema,
const sourcemeta::core::SchemaFrame & frame,
const sourcemeta::core::SchemaFrame::Location & location,
const sourcemeta::core::SchemaWalker & walker,
const sourcemeta::core::SchemaResolver & resolver,
sourcemeta::core::WeakPointer & base )->sourcemeta::core::JSON

Wrap a schema to only access one of its subschemas. This is useful if you want to perform validation on only a specific part of the schema without having to reinvent the wheel. For example:

#include <sourcemeta/core/json.h>
#include <sourcemeta/core/jsonpointer.h>
#include <sourcemeta/core/jsonschema.h>
#include <sourcemeta/blaze/alterschema.h>
#include <iostream>
const sourcemeta::core::JSON document =
sourcemeta::core::parse_json(R"JSON({
"$schema": "https://json-schema.org/draft/2020-12/schema",
"items": { "type": "string" }
})JSON");
const sourcemeta::core::SchemaFrame frame{
sourcemeta::core::SchemaFrame::Mode::References, document,
sourcemeta::core::schema_walker, sourcemeta::core::schema_resolver};
const sourcemeta::core::Pointer pointer{"items"};
const auto location{frame.traverse(
sourcemeta::core::to_weak_pointer(pointer),
sourcemeta::core::SchemaFrame::LocationType::Subschema)};
sourcemeta::core::WeakPointer base;
const sourcemeta::core::JSON result =
sourcemeta::blaze::wrap(document, frame, location.value().get(),
sourcemeta::core::schema_walker, sourcemeta::core::schema_resolver,
base);
sourcemeta::core::prettify(result, std::cerr);
std::cerr << "\n";
SOURCEMETA_BLAZE_ALTERSCHEMA_EXPORT auto wrap(const sourcemeta::core::JSON &schema, const sourcemeta::core::SchemaFrame &frame, const sourcemeta::core::SchemaFrame::Location &location, const sourcemeta::core::SchemaWalker &walker, const sourcemeta::core::SchemaResolver &resolver, sourcemeta::core::WeakPointer &base) -> sourcemeta::core::JSON