diff --git a/test/alterschema/CMakeLists.txt b/test/alterschema/CMakeLists.txt index a488fe616..d6e09f7fa 100644 --- a/test/alterschema/CMakeLists.txt +++ b/test/alterschema/CMakeLists.txt @@ -27,3 +27,13 @@ target_link_libraries(sourcemeta_core_alterschema_unit PRIVATE sourcemeta::core::jsonschema) target_link_libraries(sourcemeta_core_alterschema_unit PRIVATE sourcemeta::core::alterschema) + +sourcemeta_executable(NAMESPACE sourcemeta PROJECT core + NAME alterschema_canonicalize + SOURCES alterschema_canonicalize.cc) +target_link_libraries(sourcemeta_core_alterschema_canonicalize + PRIVATE sourcemeta::core::json) +target_link_libraries(sourcemeta_core_alterschema_canonicalize + PRIVATE sourcemeta::core::jsonschema) +target_link_libraries(sourcemeta_core_alterschema_canonicalize + PRIVATE sourcemeta::core::alterschema) diff --git a/test/alterschema/alterschema_canonicalize.cc b/test/alterschema/alterschema_canonicalize.cc new file mode 100644 index 000000000..f390a24f2 --- /dev/null +++ b/test/alterschema/alterschema_canonicalize.cc @@ -0,0 +1,35 @@ +#include +#include +#include + +#include // EXIT_SUCCESS, EXIT_FAILURE +#include // std::cerr, std::cout + +auto main(int argc, char *argv[]) -> int { + if (argc != 2) { + std::cerr << "Usage: " << argv[0] << " \n"; + return EXIT_FAILURE; + } + + auto document{sourcemeta::core::read_json(argv[1])}; + + sourcemeta::core::SchemaTransformer bundle; + sourcemeta::core::add(bundle, + sourcemeta::core::AlterSchemaMode::Canonicalizer); + const auto result{bundle.apply(document, sourcemeta::core::schema_walker, + sourcemeta::core::schema_resolver, + [](const auto &pointer, const auto &name, + const auto &message, const auto &) { + std::cerr + << sourcemeta::core::to_string(pointer) + << ": " << name << ": " << message + << "\n"; + })}; + + sourcemeta::core::format(document, sourcemeta::core::schema_walker, + sourcemeta::core::schema_resolver); + sourcemeta::core::prettify(document, std::cout); + std::cout << "\n"; + + return result.first ? EXIT_SUCCESS : EXIT_FAILURE; +}