#pragma once #include #include #include #include namespace jvalidate::adapter { template class JsonCppAdapter; template <> struct AdapterTraits { template using Adapter = adapter::JsonCppAdapter; using ConstAdapter = adapter::JsonCppAdapter; static Json::Value const & const_empty() { static Json::Value const g_value; return g_value; } }; template class JsonCppObjectAdapter : public detail::SimpleObjectAdapter { public: using JsonCppObjectAdapter::SimpleObjectAdapter::SimpleObjectAdapter; bool contains(std::string const & key) const { return this->const_value().isMember(key); } JsonCppAdapter operator[](std::string const & key) const { return this->value() ? &(*this->value())[key] : nullptr; } }; template class JsonCppAdapter final : public detail::SimpleAdapter { private: JSON * value_; public: using JsonCppAdapter::SimpleAdapter::SimpleAdapter; Type type() const { switch (const_value().type()) { case Json::nullValue: return Type::Null; case Json::booleanValue: return Type::Boolean; case Json::realValue: return Type::Number; case Json::stringValue: return Type::String; case Json::arrayValue: return Type::Array; case Json::objectValue: return Type::Object; case Json::intValue: case Json::uintValue: return Type::Integer; } } bool as_boolean() const { return const_value().asBool(); } int64_t as_integer() const { return const_value().asInt64(); } double as_number() const { return const_value().asDouble(); } std::string as_string() const { return const_value().asString(); } JsonCppObjectAdapter as_object() const { return value_; } static std::string key(auto it) { return it.key().asString(); } private: using JsonCppAdapter::SimpleAdapter::const_value; }; }