1+ #include < sourcemeta/jsonbinpack/compiler.h>
2+
13#include < sourcemeta/alterschema/engine.h>
24#include < sourcemeta/alterschema/linter.h>
3- #include < sourcemeta/jsonbinpack/compiler.h>
4- #include < sourcemeta/jsontoolkit/jsonschema.h>
55
66#include < cassert> // assert
7- #include < future> // std::future
87#include < limits> // std::numeric_limits
98
9+ #include " encoding.h"
1010#include " states.h"
1111
12- namespace {
13- constexpr auto ENCODING_V1{" tag:sourcemeta.com,2024:jsonbinpack/encoding/v1" };
14- auto make_resolver (const sourcemeta::jsontoolkit::SchemaResolver &fallback)
15- -> auto {
16- return [&fallback](std::string_view identifier)
17- -> std::future<std::optional<sourcemeta::jsontoolkit::JSON>> {
18- std::promise<std::optional<sourcemeta::jsontoolkit::JSON>> promise;
19- if (identifier == ENCODING_V1) {
20- promise.set_value (sourcemeta::jsontoolkit::parse (R"JSON( {
21- "$id": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1",
22- "$schema": "https://json-schema.org/draft/2020-12/schema",
23- "$vocabulary": { "https://json-schema.org/draft/2020-12/vocab/core": true }
24- })JSON" ));
25- } else {
26- promise.set_value (fallback (identifier).get ());
27- }
28-
29- return promise.get_future ();
30- };
31- }
32- } // namespace
33-
3412namespace sourcemeta ::jsonbinpack {
3513
3614auto canonicalize (sourcemeta::jsontoolkit::JSON &schema,
3715 const sourcemeta::jsontoolkit::SchemaWalker &walker,
3816 const sourcemeta::jsontoolkit::SchemaResolver &resolver,
3917 const std::optional<std::string> &default_dialect) -> void {
40- sourcemeta::alterschema::Bundle canonicalizer;
41- sourcemeta::alterschema::add (
42- canonicalizer, sourcemeta::alterschema::LinterCategory::AntiPattern);
43- sourcemeta::alterschema::add (
44- canonicalizer, sourcemeta::alterschema::LinterCategory::Simplify);
45- sourcemeta::alterschema::add (
46- canonicalizer, sourcemeta::alterschema::LinterCategory::Desugar);
47- sourcemeta::alterschema::add (
48- canonicalizer, sourcemeta::alterschema::LinterCategory::Implicit);
49- sourcemeta::alterschema::add (
50- canonicalizer, sourcemeta::alterschema::LinterCategory::Superfluous);
18+ namespace alterschema = sourcemeta::alterschema;
19+ alterschema::Bundle canonicalizer;
20+ alterschema::add (canonicalizer, alterschema::LinterCategory::AntiPattern);
21+ alterschema::add (canonicalizer, alterschema::LinterCategory::Simplify);
22+ alterschema::add (canonicalizer, alterschema::LinterCategory::Desugar);
23+ alterschema::add (canonicalizer, alterschema::LinterCategory::Implicit);
24+ alterschema::add (canonicalizer, alterschema::LinterCategory::Superfluous);
5125 canonicalizer.apply (schema, walker, make_resolver (resolver),
5226 sourcemeta::jsontoolkit::empty_pointer, default_dialect);
5327}
5428
55- auto is_encoding (const sourcemeta::jsontoolkit::JSON &document) -> bool {
56- const std::optional<std::string> dialect{
57- sourcemeta::jsontoolkit::dialect (document)};
58- return dialect.has_value () && document.defines (" name" ) &&
59- document.defines (" options" ) && dialect.value () == ENCODING_V1;
60- }
61-
6229auto make_encoding (sourcemeta::alterschema::Transformer &document,
6330 const std::string &encoding,
6431 const sourcemeta::jsontoolkit::JSON &options) -> void {
@@ -73,21 +40,21 @@ template <typename T> constexpr auto is_byte(const T value) noexcept -> bool {
7340 return value <= std::numeric_limits<std::uint8_t >::max ();
7441}
7542
76- #include " mapper_rules /enum_8_bit.h"
77- #include " mapper_rules /enum_8_bit_top_level.h"
78- #include " mapper_rules /enum_arbitrary.h"
79- #include " mapper_rules /enum_singleton.h"
80- #include " mapper_rules /integer_bounded_8_bit.h"
81- #include " mapper_rules /integer_bounded_greater_than_8_bit.h"
82- #include " mapper_rules /integer_bounded_multiplier_8_bit.h"
83- #include " mapper_rules /integer_bounded_multiplier_greater_than_8_bit.h"
84- #include " mapper_rules /integer_lower_bound.h"
85- #include " mapper_rules /integer_lower_bound_multiplier.h"
86- #include " mapper_rules /integer_unbound.h"
87- #include " mapper_rules /integer_unbound_multiplier.h"
88- #include " mapper_rules /integer_upper_bound.h"
89- #include " mapper_rules /integer_upper_bound_multiplier.h"
90- #include " mapper_rules /number_arbitrary.h"
43+ #include " mapper /enum_8_bit.h"
44+ #include " mapper /enum_8_bit_top_level.h"
45+ #include " mapper /enum_arbitrary.h"
46+ #include " mapper /enum_singleton.h"
47+ #include " mapper /integer_bounded_8_bit.h"
48+ #include " mapper /integer_bounded_greater_than_8_bit.h"
49+ #include " mapper /integer_bounded_multiplier_8_bit.h"
50+ #include " mapper /integer_bounded_multiplier_greater_than_8_bit.h"
51+ #include " mapper /integer_lower_bound.h"
52+ #include " mapper /integer_lower_bound_multiplier.h"
53+ #include " mapper /integer_unbound.h"
54+ #include " mapper /integer_unbound_multiplier.h"
55+ #include " mapper /integer_upper_bound.h"
56+ #include " mapper /integer_upper_bound_multiplier.h"
57+ #include " mapper /number_arbitrary.h"
9158
9259auto compile (sourcemeta::jsontoolkit::JSON &schema,
9360 const sourcemeta::jsontoolkit::SchemaWalker &walker,
@@ -122,13 +89,12 @@ auto compile(sourcemeta::jsontoolkit::JSON &schema,
12289 sourcemeta::jsontoolkit::empty_pointer, default_dialect);
12390
12491 // The "any" encoding is always the last resort
125- if (!is_encoding (schema)) {
92+ const auto dialect{sourcemeta::jsontoolkit::dialect (schema)};
93+ if (!dialect.has_value () || dialect.value () != ENCODING_V1) {
12694 sourcemeta::alterschema::Transformer transformer{schema};
12795 make_encoding (transformer, " ANY_PACKED_TYPE_TAG_BYTE_PREFIX" ,
12896 sourcemeta::jsontoolkit::JSON::make_object ());
12997 }
130-
131- assert (is_encoding (schema));
13298}
13399
134100} // namespace sourcemeta::jsonbinpack
0 commit comments