#ifndef GRPC_SRC_CORE_LIB_JSON_JSON_OBJECT_LOADER_H
#define GRPC_SRC_CORE_LIB_JSON_JSON_OBJECT_LOADER_H
#include <grpc/support/port_platform.h>
#include <cstdint>
#include <cstring>
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "absl/meta/type_traits.h"
#include "absl/status/statusor.h"
#include "absl/strings/numbers.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/lib/gprpp/no_destruct.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/gprpp/time.h"
#include "src/core/lib/gprpp/validation_errors.h"
#include "src/core/lib/json/json.h"
#include "src/core/lib/json/json_args.h"
namespace grpc_core {
namespace json_detail {
class LoaderInterface { … };
class LoadScalar : public LoaderInterface { … };
class LoadString : public LoadScalar { … };
class LoadDuration : public LoadScalar { … };
class LoadNumber : public LoadScalar { … };
template <typename T>
class TypedLoadSignedNumber : public LoadNumber { … };
template <typename T>
class TypedLoadUnsignedNumber : public LoadNumber { … };
class LoadFloat : public LoadNumber { … };
class LoadDouble : public LoadNumber { … };
class LoadBool : public LoaderInterface { … };
class LoadUnprocessedJsonObject : public LoaderInterface { … };
class LoadUnprocessedJsonArray : public LoaderInterface { … };
class LoadVector : public LoaderInterface { … };
class LoadMap : public LoaderInterface { … };
class LoadOptional : public LoaderInterface { … };
template <typename T>
const LoaderInterface* LoaderForType();
template <typename T>
class AutoLoader final : public LoaderInterface { … };
template <>
class AutoLoader<std::string> final : public LoadString { … };
template <>
class AutoLoader<Duration> final : public LoadDuration { … };
template <>
class AutoLoader<int32_t> final : public TypedLoadSignedNumber<int32_t> { … };
template <>
class AutoLoader<int64_t> final : public TypedLoadSignedNumber<int64_t> { … };
template <>
class AutoLoader<uint32_t> final : public TypedLoadUnsignedNumber<uint32_t> { … };
template <>
class AutoLoader<uint64_t> final : public TypedLoadUnsignedNumber<uint64_t> { … };
template <>
class AutoLoader<float> final : public LoadFloat { … };
template <>
class AutoLoader<double> final : public LoadDouble { … };
template <>
class AutoLoader<bool> final : public LoadBool { … };
template <>
class AutoLoader<Json::Object> final : public LoadUnprocessedJsonObject { … };
template <>
class AutoLoader<Json::Array> final : public LoadUnprocessedJsonArray { … };
AutoLoader<std::vector<T>>;
template <>
class AutoLoader<std::vector<bool>> final : public LoaderInterface { … };
AutoLoader<std::map<std::string, T>>;
AutoLoader<absl::optional<T>>;
AutoLoader<std::unique_ptr<T>>;
template <typename T>
const LoaderInterface* LoaderForType() { … }
struct Element { … };
template <typename T, size_t kSize>
class Vec { … };
Vec<T, 0>;
bool LoadObject(const Json& json, const JsonArgs& args, const Element* elements,
size_t num_elements, void* dst, ValidationErrors* errors);
template <typename T, size_t kElemCount, typename Hidden = void>
class FinishedJsonObjectLoader final : public LoaderInterface { … };
FinishedJsonObjectLoader<T, kElemCount, absl::void_t<decltype(&T::JsonPostLoad)>>;
template <typename T, size_t kElemCount = 0>
class JsonObjectLoader final { … };
const Json* GetJsonObjectField(const Json::Object& json,
absl::string_view field,
ValidationErrors* errors, bool required);
}
JsonObjectLoader;
JsonLoaderInterface;
template <typename T>
absl::StatusOr<T> LoadFromJson(
const Json& json, const JsonArgs& args = JsonArgs(),
absl::string_view error_prefix = "errors validating JSON") { … }
template <typename T>
absl::StatusOr<RefCountedPtr<T>> LoadRefCountedFromJson(
const Json& json, const JsonArgs& args = JsonArgs(),
absl::string_view error_prefix = "errors validating JSON") { … }
template <typename T>
T LoadFromJson(const Json& json, const JsonArgs& args,
ValidationErrors* errors) { … }
template <typename T>
absl::optional<T> LoadJsonObjectField(const Json::Object& json,
const JsonArgs& args,
absl::string_view field,
ValidationErrors* errors,
bool required = true) { … }
}
#endif