13#include "llvm/Support/Error.h"
14#include "llvm/Support/JSON.h"
26 return llvm::json::Array{EntityId2JSON(EPL.getEntity()),
27 llvm::json::Value(EPL.getPointerLevel())};
31 const llvm::json::Value &EPLData,
33 auto *AsArr = EPLData.getAsArray();
35 if (!AsArr || AsArr->size() != 2)
37 EPLData,
"an array with exactly two elements representing "
38 "EntityId and PointerLevel, respectively");
40 auto *EntityIdObj = (*AsArr)[0].getAsObject();
44 "an object representing EntityId");
49 return Id.takeError();
51 std::optional<uint64_t> PtrLv = (*AsArr)[1].getAsInteger();
55 "an integer representing PointerLevel");
57 return buildEntityPointerLevel(*Id, *PtrLv);
61 llvm::iterator_range<EntityPointerLevelSet::const_iterator> EPLs,
65 for (
const auto &EPL : EPLs)
71 const llvm::json::Array &EPLsData,
73 EntityPointerLevelSet EPLs;
75 for (
const auto &EltData : EPLsData) {
80 return EPL.takeError();
87 const std::map<EntityId, EntityPointerLevelSet> &Map,
89 llvm::json::Array Content;
91 for (
const auto &[Id, EPLs] : Map) {
92 Content.push_back(IdToJSON(Id));
100 const llvm::json::Array &Content,
102 if (Content.size() % 2 != 0)
104 "an even number of elements, got %lu",
105 static_cast<size_t>(Content.size()));
107 std::map<EntityId, EntityPointerLevelSet>
Result;
109 for (
size_t I = 0; I < Content.size(); I += 2) {
110 const llvm::json::Object *IdData = Content[I].getAsObject();
114 "an object representing EntityId");
116 auto Id = IdFromJSON(*IdData);
119 return Id.takeError();
121 const llvm::json::Array *EPLsData = Content[I + 1].getAsArray();
125 Content[I + 1],
"an array representing EntityPointerLevelSet");
130 return EPLs.takeError();
131 Result[*Id] = std::move(*EPLs);
Expected< std::map< EntityId, EntityPointerLevelSet > > entityPointerLevelMapFromJSON(const llvm::json::Array &Content, JSONFormat::EntityIdFromJSONFn IdFromJSON)
Deserialize a flat array of alternating [EntityId, EntityPointerLevelSet, ...] pairs into a map.
llvm::json::Array entityPointerLevelSetToJSON(llvm::iterator_range< EntityPointerLevelSet::const_iterator > EPLs, JSONFormat::EntityIdToJSONFn EntityId2JSON)
llvm::json::Value entityPointerLevelToJSON(const EntityPointerLevel &EPL, JSONFormat::EntityIdToJSONFn EntityId2JSON)
llvm::Error makeSawButExpectedError(const JSONTy &Saw, llvm::StringRef Expected, const Ts &...ExpectedArgs)
Expected< EntityPointerLevelSet > entityPointerLevelSetFromJSON(const llvm::json::Array &EPLsData, JSONFormat::EntityIdFromJSONFn EntityIdFromJSON)
Expected< EntityPointerLevel > entityPointerLevelFromJSON(const llvm::json::Value &EPLData, JSONFormat::EntityIdFromJSONFn EntityIdFromJSON)
llvm::json::Array entityPointerLevelMapToJSON(const std::map< EntityId, EntityPointerLevelSet > &Map, JSONFormat::EntityIdToJSONFn IdToJSON)
Serialize a map<EntityId, EntityPointerLevelSet> as a flat array of alternating [EntityId,...
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.