Skip to content

Commit 6075e56

Browse files
authored
Simplify SchemaFrame::to_json using the json_auto templates (#1770)
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent 8fe9063 commit 6075e56

File tree

2 files changed

+39
-60
lines changed

2 files changed

+39
-60
lines changed

src/core/jsonschema/frame.cc

Lines changed: 39 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -322,78 +322,58 @@ auto repopulate_instance_locations(
322322

323323
namespace sourcemeta::core {
324324

325+
auto to_json(const SchemaReferenceType value) -> JSON {
326+
return JSON{value == SchemaReferenceType::Static ? "static" : "dynamic"};
327+
}
328+
329+
auto to_json(const SchemaFrame::LocationType value) -> JSON {
330+
switch (value) {
331+
case SchemaFrame::LocationType::Resource:
332+
return JSON{"resource"};
333+
case SchemaFrame::LocationType::Anchor:
334+
return JSON{"anchor"};
335+
case SchemaFrame::LocationType::Pointer:
336+
return JSON{"pointer"};
337+
case SchemaFrame::LocationType::Subschema:
338+
return JSON{"subschema"};
339+
default:
340+
assert(false);
341+
return JSON{nullptr};
342+
}
343+
}
344+
325345
auto SchemaFrame::to_json() const -> JSON {
326346
auto root{JSON::make_object()};
327347

328348
root.assign("locations", JSON::make_array());
329349
for (const auto &location : this->locations_) {
330350
auto entry{JSON::make_object()};
331351
entry.assign("referenceType",
332-
JSON{location.first.first == SchemaReferenceType::Static
333-
? "static"
334-
: "dynamic"});
335-
entry.assign("uri", JSON{location.first.second});
336-
337-
if (location.second.parent.has_value()) {
338-
entry.assign("parent", JSON{to_string(location.second.parent.value())});
339-
} else {
340-
entry.assign("parent", JSON{nullptr});
341-
}
342-
343-
switch (location.second.type) {
344-
case LocationType::Resource:
345-
entry.assign("type", JSON{"resource"});
346-
break;
347-
case LocationType::Anchor:
348-
entry.assign("type", JSON{"anchor"});
349-
break;
350-
case LocationType::Pointer:
351-
entry.assign("type", JSON{"pointer"});
352-
break;
353-
case LocationType::Subschema:
354-
entry.assign("type", JSON{"subschema"});
355-
break;
356-
default:
357-
assert(false);
358-
}
359-
360-
if (location.second.root.has_value()) {
361-
entry.assign("root", JSON{location.second.root.value()});
362-
} else {
363-
entry.assign("root", JSON{nullptr});
364-
}
365-
366-
entry.assign("base", JSON{location.second.base});
367-
entry.assign("pointer", JSON{to_string(location.second.pointer)});
352+
sourcemeta::core::to_json(location.first.first));
353+
entry.assign("uri", sourcemeta::core::to_json(location.first.second));
354+
entry.assign("parent", sourcemeta::core::to_json(location.second.parent));
355+
entry.assign("type", sourcemeta::core::to_json(location.second.type));
356+
entry.assign("root", sourcemeta::core::to_json(location.second.root));
357+
entry.assign("base", sourcemeta::core::to_json(location.second.base));
358+
entry.assign("pointer", sourcemeta::core::to_json(location.second.pointer));
368359
entry.assign("relativePointer",
369-
JSON{to_string(location.second.relative_pointer)});
370-
entry.assign("dialect", JSON{location.second.dialect});
371-
entry.assign("baseDialect", JSON{location.second.base_dialect});
360+
sourcemeta::core::to_json(location.second.relative_pointer));
361+
entry.assign("dialect", sourcemeta::core::to_json(location.second.dialect));
362+
entry.assign("baseDialect",
363+
sourcemeta::core::to_json(location.second.base_dialect));
372364
root.at("locations").push_back(std::move(entry));
373365
}
374366

375367
root.assign("references", JSON::make_array());
376368
for (const auto &reference : this->references_) {
377369
auto entry{JSON::make_object()};
378-
entry.assign("type",
379-
JSON{reference.first.first == SchemaReferenceType::Static
380-
? "static"
381-
: "dynamic"});
382-
entry.assign("origin", JSON{to_string(reference.first.second)});
383-
entry.assign("destination", JSON{reference.second.destination});
384-
385-
if (reference.second.base.has_value()) {
386-
entry.assign("base", JSON{reference.second.base.value()});
387-
} else {
388-
entry.assign("base", JSON{nullptr});
389-
}
390-
391-
if (reference.second.fragment.has_value()) {
392-
entry.assign("fragment", JSON{reference.second.fragment.value()});
393-
} else {
394-
entry.assign("fragment", JSON{nullptr});
395-
}
396-
370+
entry.assign("type", sourcemeta::core::to_json(reference.first.first));
371+
entry.assign("origin", sourcemeta::core::to_json(reference.first.second));
372+
entry.assign("destination",
373+
sourcemeta::core::to_json(reference.second.destination));
374+
entry.assign("base", sourcemeta::core::to_json(reference.second.base));
375+
entry.assign("fragment",
376+
sourcemeta::core::to_json(reference.second.fragment));
397377
root.at("references").push_back(std::move(entry));
398378
}
399379

@@ -408,7 +388,7 @@ auto SchemaFrame::to_json() const -> JSON {
408388
// TODO: Overload .to_string() for PointerTemplate
409389
std::ostringstream result;
410390
sourcemeta::core::stringify(pointer, result);
411-
entry.push_back(JSON{result.str()});
391+
entry.push_back(sourcemeta::core::to_json(result.str()));
412392
}
413393

414394
root.at("instances").assign(to_string(instance.first), std::move(entry));

src/core/jsonschema/include/sourcemeta/core/jsonschema_frame.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include <functional> // std::reference_wrapper
1717
#include <map> // std::map
1818
#include <optional> // std::optional
19-
#include <ostream> // std::ostream
2019
#include <set> // std::set
2120
#include <tuple> // std::tuple
2221
#include <unordered_set> // std::unordered_set

0 commit comments

Comments
 (0)