#pragma once #include #include #include #include #include #include #include #include #include namespace jvalidate::detail { template class UnsupportedArrayAdapter { public: size_t size() const { return 0; } CRTP operator[](size_t) const { throw std::runtime_error("stub implementation"); } std::vector::const_iterator begin() const { return {}; } std::vector::const_iterator end() const { return {}; } }; template class UnsupportedObjectAdapter { public: size_t size() const { return 0; } bool contains(std::string_view) const { return false; } CRTP operator[](std::string_view) const { throw std::runtime_error("stub implementation"); } std::map::const_iterator begin() const { return {}; } std::map::const_iterator end() const { return {}; } }; class StringAdapter final : public adapter::Adapter { public: using value_type = std::string_view; StringAdapter(std::string_view value) : value_(value) {} adapter::Type type() const { return adapter::Type::String; } bool as_boolean() const { die("boolean"); } int64_t as_integer() const { die("integer"); } double as_number() const { die("number"); } std::string as_string() const { return std::string(value_); } size_t array_size() const { die("array"); } UnsupportedArrayAdapter as_array() const { die("array"); } Status apply_array(adapter::AdapterCallback const &) const { return Status::Noop; } size_t object_size() const { die("object"); } UnsupportedObjectAdapter as_object() const { die("object"); } Status apply_object(adapter::ObjectAdapterCallback const &) const { return Status::Noop; } bool equals(adapter::Adapter const & rhs, bool strict) const { if (std::optional str = rhs.maybe_string(strict)) { return str == value_; } return false; } std::unique_ptr freeze() const final { return std::make_unique>(value_); } private: [[noreturn]] static void die(std::string expected) { throw std::runtime_error("StringAdapter is not an " + expected); } private: std::string_view value_; }; } template <> struct jvalidate::adapter::AdapterTraits { template using Adapter = jvalidate::detail::StringAdapter; using ConstAdapter = jvalidate::detail::StringAdapter; };