blob: dd4e9e6528ed256ff830b6b42cfda803aa0f8dc2 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PERIDOT_LIB_RAPIDJSON_RAPIDJSON_H_
#define PERIDOT_LIB_RAPIDJSON_RAPIDJSON_H_
#include <sstream>
#include <string>
#include <vector>
#include "rapidjson/document.h"
#include "rapidjson/pointer.h"
#include "rapidjson/prettywriter.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/writer.h"
namespace modular {
using JsonDoc = ::rapidjson::Document;
using JsonValue = JsonDoc::ValueType;
using JsonPointer = ::rapidjson::GenericPointer<JsonValue>;
// Helper function to convert the given JsonValue to a string. Note that a
// JsonDoc is also a JsonValue.
template <typename T>
inline std::string JsonValueToString(const T& v) {
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
v.Accept(writer);
return buffer.GetString();
}
// Like above, but pretty prints the string.
template <typename T>
inline std::string JsonValueToPrettyString(const T& v) {
rapidjson::StringBuffer buffer;
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);
v.Accept(writer);
return buffer.GetString();
}
// Take a vector of std::string and convert it to "/a/b/c" form for display.
// For debugging/logging purposes only
inline std::string PrettyPrintPath(const std::vector<std::string>& path) {
std::string result;
for (const auto& str : path) {
result += '/' + str;
}
return result;
}
// Take an array of strings representing the segments in a JSON Path
// and construct a rapidjson::GenericPointer() object.
template <typename Doc>
inline rapidjson::GenericPointer<typename Doc::ValueType> CreatePointer(
const Doc& /*doc*/, std::vector<std::string>::iterator begin,
std::vector<std::string>::iterator end) {
rapidjson::GenericPointer<typename Doc::ValueType> pointer;
for (auto it = begin; it != end; ++it) {
pointer = pointer.Append(*it, nullptr);
}
return pointer;
}
template <typename Doc, typename Collection>
inline rapidjson::GenericPointer<typename Doc::ValueType> CreatePointer(
const Doc& doc, const Collection& path) {
rapidjson::GenericPointer<typename Doc::ValueType> pointer;
for (const auto& it : path) {
pointer = pointer.Append(it, nullptr);
}
return pointer;
}
} // namespace modular
#endif // PERIDOT_LIB_RAPIDJSON_RAPIDJSON_H_