Skip to content

Commit 15822dc

Browse files
committed
Refactor and simplify src/compiler
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent a9f3934 commit 15822dc

18 files changed

+110
-129
lines changed

src/compiler/CMakeLists.txt

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
noa_library(NAMESPACE sourcemeta PROJECT jsonbinpack NAME compiler
22
FOLDER "JSON BinPack/Compiler"
33
SOURCES
4-
states.h compiler.cc
5-
mapper_rules/enum_8_bit.h
6-
mapper_rules/enum_8_bit_top_level.h
7-
mapper_rules/enum_arbitrary.h
8-
mapper_rules/enum_singleton.h
9-
mapper_rules/integer_bounded_8_bit.h
10-
mapper_rules/integer_bounded_greater_than_8_bit.h
11-
mapper_rules/integer_bounded_multiplier_8_bit.h
12-
mapper_rules/integer_bounded_multiplier_greater_than_8_bit.h
13-
mapper_rules/integer_lower_bound.h
14-
mapper_rules/integer_lower_bound_multiplier.h
15-
mapper_rules/integer_unbound.h
16-
mapper_rules/integer_unbound_multiplier.h
17-
mapper_rules/integer_upper_bound.h
18-
mapper_rules/integer_upper_bound_multiplier.h
19-
mapper_rules/number_arbitrary.h)
4+
states.h encoding.h compiler.cc
5+
mapper/enum_8_bit.h
6+
mapper/enum_8_bit_top_level.h
7+
mapper/enum_arbitrary.h
8+
mapper/enum_singleton.h
9+
mapper/integer_bounded_8_bit.h
10+
mapper/integer_bounded_greater_than_8_bit.h
11+
mapper/integer_bounded_multiplier_8_bit.h
12+
mapper/integer_bounded_multiplier_greater_than_8_bit.h
13+
mapper/integer_lower_bound.h
14+
mapper/integer_lower_bound_multiplier.h
15+
mapper/integer_unbound.h
16+
mapper/integer_unbound_multiplier.h
17+
mapper/integer_upper_bound.h
18+
mapper/integer_upper_bound_multiplier.h
19+
mapper/number_arbitrary.h)
2020

2121
if(JSONBINPACK_INSTALL)
2222
noa_library_install(NAMESPACE sourcemeta PROJECT jsonbinpack NAME compiler)

src/compiler/compiler.cc

Lines changed: 27 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,31 @@
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-
3412
namespace sourcemeta::jsonbinpack {
3513

3614
auto 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-
6229
auto 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

9259
auto 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

src/compiler/encoding.h

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#ifndef SOURCEMETA_JSONBINPACK_COMPILER_ENCODING_H_
2+
#define SOURCEMETA_JSONBINPACK_COMPILER_ENCODING_H_
3+
4+
#include <sourcemeta/jsontoolkit/json.h>
5+
#include <sourcemeta/jsontoolkit/jsonschema.h>
6+
7+
#include <future> // std::future
8+
9+
namespace sourcemeta::jsonbinpack {
10+
11+
constexpr auto ENCODING_V1{"tag:sourcemeta.com,2024:jsonbinpack/encoding/v1"};
12+
13+
inline auto
14+
make_resolver(const sourcemeta::jsontoolkit::SchemaResolver &fallback) -> auto {
15+
return [&fallback](std::string_view identifier)
16+
-> std::future<std::optional<sourcemeta::jsontoolkit::JSON>> {
17+
std::promise<std::optional<sourcemeta::jsontoolkit::JSON>> promise;
18+
if (identifier == ENCODING_V1) {
19+
promise.set_value(sourcemeta::jsontoolkit::parse(R"JSON({
20+
"$id": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1",
21+
"$schema": "https://json-schema.org/draft/2020-12/schema",
22+
"$vocabulary": { "https://json-schema.org/draft/2020-12/vocab/core": true }
23+
})JSON"));
24+
} else {
25+
promise.set_value(fallback(identifier).get());
26+
}
27+
28+
return promise.get_future();
29+
};
30+
}
31+
32+
} // namespace sourcemeta::jsonbinpack
33+
34+
#endif

src/compiler/mapper_rules/enum_8_bit.h renamed to src/compiler/mapper/enum_8_bit.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
// TODO: Unit test this mapping once we have container encodings
22
class Enum8Bit final : public sourcemeta::alterschema::Rule {
33
public:
4-
Enum8Bit() : sourcemeta::alterschema::Rule("enum_8_bit", "TODO") {};
4+
Enum8Bit() : sourcemeta::alterschema::Rule{"enum_8_bit", ""} {};
55

66
[[nodiscard]] auto condition(
77
const sourcemeta::jsontoolkit::JSON &schema, const std::string &dialect,
88
const std::set<std::string> &vocabularies,
99
const sourcemeta::jsontoolkit::Pointer &pointer) const -> bool override {
10-
return !is_encoding(schema) &&
11-
dialect == "https://json-schema.org/draft/2020-12/schema" &&
10+
return dialect == "https://json-schema.org/draft/2020-12/schema" &&
1211
vocabularies.contains(
1312
"https://json-schema.org/draft/2020-12/vocab/validation") &&
1413
schema.defines("enum") && schema.at("enum").is_array() &&

src/compiler/mapper_rules/enum_8_bit_top_level.h renamed to src/compiler/mapper/enum_8_bit_top_level.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
class Enum8BitTopLevel final : public sourcemeta::alterschema::Rule {
22
public:
33
Enum8BitTopLevel()
4-
: sourcemeta::alterschema::Rule("enum_8_bit_top_level", "TODO") {};
4+
: sourcemeta::alterschema::Rule{"enum_8_bit_top_level", ""} {};
55

66
[[nodiscard]] auto condition(
77
const sourcemeta::jsontoolkit::JSON &schema, const std::string &dialect,
88
const std::set<std::string> &vocabularies,
99
const sourcemeta::jsontoolkit::Pointer &pointer) const -> bool override {
10-
return !is_encoding(schema) &&
11-
dialect == "https://json-schema.org/draft/2020-12/schema" &&
10+
return dialect == "https://json-schema.org/draft/2020-12/schema" &&
1211
vocabularies.contains(
1312
"https://json-schema.org/draft/2020-12/vocab/validation") &&
1413
schema.defines("enum") && schema.at("enum").is_array() &&

src/compiler/mapper_rules/enum_arbitrary.h renamed to src/compiler/mapper/enum_arbitrary.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
// TODO: Unit test this mapping once we have container encodings
22
class EnumArbitrary final : public sourcemeta::alterschema::Rule {
33
public:
4-
EnumArbitrary() : sourcemeta::alterschema::Rule("enum_arbitrary", "TODO") {};
4+
EnumArbitrary() : sourcemeta::alterschema::Rule{"enum_arbitrary", ""} {};
55

66
[[nodiscard]] auto condition(
77
const sourcemeta::jsontoolkit::JSON &schema, const std::string &dialect,
88
const std::set<std::string> &vocabularies,
99
const sourcemeta::jsontoolkit::Pointer &pointer) const -> bool override {
10-
return !is_encoding(schema) &&
11-
dialect == "https://json-schema.org/draft/2020-12/schema" &&
10+
return dialect == "https://json-schema.org/draft/2020-12/schema" &&
1211
vocabularies.contains(
1312
"https://json-schema.org/draft/2020-12/vocab/validation") &&
1413
schema.defines("enum") && schema.at("enum").is_array() &&

src/compiler/mapper_rules/enum_singleton.h renamed to src/compiler/mapper/enum_singleton.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
class EnumSingleton final : public sourcemeta::alterschema::Rule {
22
public:
3-
EnumSingleton() : sourcemeta::alterschema::Rule("enum_singleton", "TODO") {};
3+
EnumSingleton() : sourcemeta::alterschema::Rule{"enum_singleton", ""} {};
44

55
[[nodiscard]] auto condition(const sourcemeta::jsontoolkit::JSON &schema,
66
const std::string &dialect,
77
const std::set<std::string> &vocabularies,
88
const sourcemeta::jsontoolkit::Pointer &) const
99
-> bool override {
10-
return !is_encoding(schema) &&
11-
dialect == "https://json-schema.org/draft/2020-12/schema" &&
10+
return dialect == "https://json-schema.org/draft/2020-12/schema" &&
1211
vocabularies.contains(
1312
"https://json-schema.org/draft/2020-12/vocab/validation") &&
1413
schema.defines("enum") && schema.at("enum").is_array() &&

src/compiler/mapper_rules/integer_bounded_8_bit.h renamed to src/compiler/mapper/integer_bounded_8_bit.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
class IntegerBounded8Bit final : public sourcemeta::alterschema::Rule {
22
public:
33
IntegerBounded8Bit()
4-
: sourcemeta::alterschema::Rule("integer_bounded_8_bit", "TODO") {};
4+
: sourcemeta::alterschema::Rule{"integer_bounded_8_bit", ""} {};
55

66
[[nodiscard]] auto condition(const sourcemeta::jsontoolkit::JSON &schema,
77
const std::string &dialect,
88
const std::set<std::string> &vocabularies,
99
const sourcemeta::jsontoolkit::Pointer &) const
1010
-> bool override {
11-
return !is_encoding(schema) &&
12-
dialect == "https://json-schema.org/draft/2020-12/schema" &&
11+
return dialect == "https://json-schema.org/draft/2020-12/schema" &&
1312
vocabularies.contains(
1413
"https://json-schema.org/draft/2020-12/vocab/validation") &&
1514
schema.defines("type") &&

src/compiler/mapper_rules/integer_bounded_greater_than_8_bit.h renamed to src/compiler/mapper/integer_bounded_greater_than_8_bit.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@ class IntegerBoundedGreaterThan8Bit final
22
: public sourcemeta::alterschema::Rule {
33
public:
44
IntegerBoundedGreaterThan8Bit()
5-
: sourcemeta::alterschema::Rule("integer_bounded_greater_than_8_bit",
6-
"TODO") {};
5+
: sourcemeta::alterschema::Rule{"integer_bounded_greater_than_8_bit",
6+
""} {};
77

88
[[nodiscard]] auto condition(const sourcemeta::jsontoolkit::JSON &schema,
99
const std::string &dialect,
1010
const std::set<std::string> &vocabularies,
1111
const sourcemeta::jsontoolkit::Pointer &) const
1212
-> bool override {
13-
return !is_encoding(schema) &&
14-
dialect == "https://json-schema.org/draft/2020-12/schema" &&
13+
return dialect == "https://json-schema.org/draft/2020-12/schema" &&
1514
vocabularies.contains(
1615
"https://json-schema.org/draft/2020-12/vocab/validation") &&
1716
schema.defines("type") &&

src/compiler/mapper_rules/integer_bounded_multiplier_8_bit.h renamed to src/compiler/mapper/integer_bounded_multiplier_8_bit.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@ class IntegerBoundedMultiplier8Bit final
22
: public sourcemeta::alterschema::Rule {
33
public:
44
IntegerBoundedMultiplier8Bit()
5-
: sourcemeta::alterschema::Rule("integer_bounded_multiplier_8_bit",
6-
"TODO") {};
5+
: sourcemeta::alterschema::Rule{"integer_bounded_multiplier_8_bit", ""} {
6+
};
77

88
[[nodiscard]] auto condition(const sourcemeta::jsontoolkit::JSON &schema,
99
const std::string &dialect,
1010
const std::set<std::string> &vocabularies,
1111
const sourcemeta::jsontoolkit::Pointer &) const
1212
-> bool override {
13-
if (is_encoding(schema) ||
14-
dialect != "https://json-schema.org/draft/2020-12/schema" ||
13+
if (dialect != "https://json-schema.org/draft/2020-12/schema" ||
1514
!vocabularies.contains(
1615
"https://json-schema.org/draft/2020-12/vocab/validation") ||
1716
!schema.defines("type") || schema.at("type").to_string() != "integer" ||

0 commit comments

Comments
 (0)