string_adapter.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #pragma once
  2. #include <map>
  3. #include <stdexcept>
  4. #include <string_view>
  5. #include <vector>
  6. #include <jvalidate/adapter.h>
  7. #include <jvalidate/detail/number.h>
  8. #include <jvalidate/detail/simple_adapter.h>
  9. #include <jvalidate/enum.h>
  10. #include <jvalidate/status.h>
  11. namespace jvalidate::detail {
  12. template <typename CRTP> class UnsupportedArrayAdapter {
  13. public:
  14. size_t size() const { return 0; }
  15. CRTP operator[](size_t) const { throw std::runtime_error("stub implementation"); }
  16. std::vector<CRTP>::const_iterator begin() const { return {}; }
  17. std::vector<CRTP>::const_iterator end() const { return {}; }
  18. };
  19. template <typename CRTP> class UnsupportedObjectAdapter {
  20. public:
  21. size_t size() const { return 0; }
  22. bool contains(std::string_view) const { return false; }
  23. CRTP operator[](std::string_view) const { throw std::runtime_error("stub implementation"); }
  24. std::map<std::string, CRTP>::const_iterator begin() const { return {}; }
  25. std::map<std::string, CRTP>::const_iterator end() const { return {}; }
  26. };
  27. class StringAdapter final : public adapter::Adapter {
  28. public:
  29. using value_type = std::string_view;
  30. StringAdapter(std::string_view value) : value_(value) {}
  31. adapter::Type type() const { return adapter::Type::String; }
  32. bool as_boolean() const { die("boolean"); }
  33. int64_t as_integer() const { die("integer"); }
  34. double as_number() const { die("number"); }
  35. std::string as_string() const { return std::string(value_); }
  36. size_t array_size() const { die("array"); }
  37. UnsupportedArrayAdapter<StringAdapter> as_array() const { die("array"); }
  38. Status apply_array(adapter::AdapterCallback const &) const { return Status::Noop; }
  39. size_t object_size() const { die("object"); }
  40. UnsupportedObjectAdapter<StringAdapter> as_object() const { die("object"); }
  41. Status apply_object(adapter::ObjectAdapterCallback const &) const { return Status::Noop; }
  42. bool equals(adapter::Adapter const & rhs, bool strict) const {
  43. if (std::optional str = rhs.maybe_string(strict)) {
  44. return str == value_;
  45. }
  46. return false;
  47. }
  48. std::unique_ptr<adapter::Const const> freeze() const final {
  49. return std::make_unique<adapter::detail::GenericConst<std::string_view>>(value_);
  50. }
  51. private:
  52. [[noreturn]] static void die(std::string expected) {
  53. throw std::runtime_error("StringAdapter is not an " + expected);
  54. }
  55. private:
  56. std::string_view value_;
  57. };
  58. }
  59. template <> struct jvalidate::adapter::AdapterTraits<std::string_view> {
  60. template <typename> using Adapter = jvalidate::detail::StringAdapter;
  61. using ConstAdapter = jvalidate::detail::StringAdapter;
  62. };