version.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #pragma once
  2. #include <map>
  3. #include <jvalidate/detail/expect.h>
  4. #include <jvalidate/enum.h>
  5. namespace jvalidate::detail {
  6. inline schema::Version version(std::string_view url) {
  7. static std::map<std::string_view, schema::Version> const g_schema_ids{
  8. {"json-schema.org/draft-04/schema", schema::Version::Draft04},
  9. {"json-schema.org/draft-06/schema", schema::Version::Draft06},
  10. {"json-schema.org/draft-07/schema", schema::Version::Draft07},
  11. {"json-schema.org/draft/2019-09/schema", schema::Version::Draft2019_09},
  12. {"json-schema.org/draft/2020-12/schema", schema::Version::Draft2020_12},
  13. };
  14. if (url.ends_with('#')) {
  15. url.remove_suffix(1);
  16. }
  17. if (url.starts_with("http://") || url.starts_with("https://")) {
  18. url.remove_prefix(url.find(':') + 3);
  19. }
  20. auto it = g_schema_ids.find(url);
  21. EXPECT_T(it != g_schema_ids.end(), std::invalid_argument, url);
  22. return it->second;
  23. }
  24. schema::Version version(Adapter auto const & json) {
  25. EXPECT(json.type() == adapter::Type::Object);
  26. EXPECT(json.as_object().contains("$schema"));
  27. auto const & schema = json.as_object()["$schema"];
  28. EXPECT(schema.type() == adapter::Type::String);
  29. return version(schema.as_string());
  30. }
  31. schema::Version version(Adapter auto const & json, schema::Version default_version) {
  32. RETURN_UNLESS(json.type() == adapter::Type::Object, default_version);
  33. RETURN_UNLESS(json.as_object().contains("$schema"), default_version);
  34. auto const & schema = json.as_object()["$schema"];
  35. RETURN_UNLESS(schema.type() == adapter::Type::String, default_version);
  36. return version(schema.as_string());
  37. }
  38. }