16#include <rapidjson/document.h>
17#include <rapidjson/prettywriter.h>
18#include <rapidjson/stringbuffer.h>
19#include <rapidjson/writer.h>
45 rapidjson::Document d;
49 rapidjson::StringBuffer buffer;
51 rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);
54 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
58 return buffer.GetString();
64 rapidjson::Document::AllocatorType &allocator = d.GetAllocator();
70 rapidjson::Value v_kind;
71 v_kind.SetString(*kind_, allocator);
72 v.AddMember(
"kind", v_kind, allocator);
75 rapidjson::Value v_apiVersion;
76 v_apiVersion.SetString(*apiVersion_, allocator);
77 v.AddMember(
"apiVersion", v_apiVersion, allocator);
80 rapidjson::Value v_id;
81 v_id.SetString(*id_, allocator);
82 v.AddMember(
"id", v_id, allocator);
85 rapidjson::Value v_type;
86 v_type.SetString(*type_, allocator);
87 v.AddMember(
"type", v_type, allocator);
90 rapidjson::Value v_sub_type;
91 v_sub_type.SetString(*sub_type_, allocator);
92 v.AddMember(
"sub-type", v_sub_type, allocator);
95 rapidjson::Value v__class;
96 v__class.SetString(*_class_, allocator);
97 v.AddMember(
"class", v__class, allocator);
100 rapidjson::Value v_mode;
101 v_mode.SetString(*mode_, allocator);
102 v.AddMember(
"mode", v_mode, allocator);
105 rapidjson::Value v_outcome;
106 v_outcome.SetString(*outcome_, allocator);
107 v.AddMember(
"outcome", v_outcome, allocator);
109 rapidjson::Value v_error(rapidjson::kArrayType);
110 v_error.Reserve(error_.size(), allocator);
111 for (
const auto &e : error_) {
113 v.SetString(e, allocator);
114 v_error.PushBack(v, allocator);
116 v.AddMember(
"error", v_error, allocator);
118 rapidjson::Value v_message;
119 v_message.SetString(*message_, allocator);
120 v.AddMember(
"message", v_message, allocator);
123 rapidjson::Value v_parent;
124 v_parent.SetString(*parent_, allocator);
125 v.AddMember(
"parent", v_parent, allocator);
128 rapidjson::Value v_priority;
129 v_priority.SetInt64(*priority_);
130 v.AddMember(
"priority", v_priority, allocator);
132 rapidjson::Value v_parameters(rapidjson::kArrayType);
133 v_parameters.Reserve(parameters_.size(), allocator);
134 for (
const auto &e : parameters_) {
136 v.SetString(e, allocator);
137 v_parameters.PushBack(v, allocator);
139 v.AddMember(
"parameters", v_parameters, allocator);
140 rapidjson::Value v_meta(rapidjson::kArrayType);
141 v_meta.Reserve(meta_.size(), allocator);
142 for (
const auto &e : meta_) {
144 v.SetString(e, allocator);
145 v_meta.PushBack(v, allocator);
147 v.AddMember(
"meta", v_meta, allocator);
148 rapidjson::Value v_plans(rapidjson::kArrayType);
149 v_plans.Reserve(plans_.size(), allocator);
150 for (
const auto &e : plans_) {
152 v.SetString(e, allocator);
153 v_plans.PushBack(v, allocator);
155 v.AddMember(
"plans", v_plans, allocator);
156 rapidjson::Value v_required_resources(rapidjson::kArrayType);
157 v_required_resources.Reserve(required_resources_.size(), allocator);
158 for (
const auto &e : required_resources_) {
160 v.SetString(e, allocator);
161 v_required_resources.PushBack(v, allocator);
163 v.AddMember(
"required-resources", v_required_resources, allocator);
164 rapidjson::Value v_acquired_resources(rapidjson::kArrayType);
165 v_acquired_resources.Reserve(acquired_resources_.size(), allocator);
166 for (
const auto &e : acquired_resources_) {
168 v.SetString(e, allocator);
169 v_acquired_resources.PushBack(v, allocator);
171 v.AddMember(
"acquired-resources", v_acquired_resources, allocator);
177 rapidjson::Document d;
186 if (d.HasMember(
"kind") && d[
"kind"].IsString()) {
187 kind_ = d[
"kind"].GetString();
189 if (d.HasMember(
"apiVersion") && d[
"apiVersion"].IsString()) {
190 apiVersion_ = d[
"apiVersion"].GetString();
192 if (d.HasMember(
"id") && d[
"id"].IsString()) {
193 id_ = d[
"id"].GetString();
195 if (d.HasMember(
"type") && d[
"type"].IsString()) {
196 type_ = d[
"type"].GetString();
198 if (d.HasMember(
"sub-type") && d[
"sub-type"].IsString()) {
199 sub_type_ = d[
"sub-type"].GetString();
201 if (d.HasMember(
"class") && d[
"class"].IsString()) {
202 _class_ = d[
"class"].GetString();
204 if (d.HasMember(
"mode") && d[
"mode"].IsString()) {
205 mode_ = d[
"mode"].GetString();
207 if (d.HasMember(
"outcome") && d[
"outcome"].IsString()) {
208 outcome_ = d[
"outcome"].GetString();
210 if (d.HasMember(
"error") && d[
"error"].IsArray()) {
211 const rapidjson::Value &a = d[
"error"];
212 error_ = std::vector<std::string>{};
214 error_.reserve(a.Size());
215 for (
auto &v : a.GetArray()) {
216 error_.push_back(v.GetString());
219 if (d.HasMember(
"message") && d[
"message"].IsString()) {
220 message_ = d[
"message"].GetString();
222 if (d.HasMember(
"parent") && d[
"parent"].IsString()) {
223 parent_ = d[
"parent"].GetString();
225 if (d.HasMember(
"priority") && d[
"priority"].IsInt64()) {
226 priority_ = d[
"priority"].GetInt64();
228 if (d.HasMember(
"parameters") && d[
"parameters"].IsArray()) {
229 const rapidjson::Value &a = d[
"parameters"];
230 parameters_ = std::vector<std::string>{};
232 parameters_.reserve(a.Size());
233 for (
auto &v : a.GetArray()) {
234 parameters_.push_back(v.GetString());
237 if (d.HasMember(
"meta") && d[
"meta"].IsArray()) {
238 const rapidjson::Value &a = d[
"meta"];
239 meta_ = std::vector<std::string>{};
241 meta_.reserve(a.Size());
242 for (
auto &v : a.GetArray()) {
243 meta_.push_back(v.GetString());
246 if (d.HasMember(
"plans") && d[
"plans"].IsArray()) {
247 const rapidjson::Value &a = d[
"plans"];
248 plans_ = std::vector<std::string>{};
250 plans_.reserve(a.Size());
251 for (
auto &v : a.GetArray()) {
252 plans_.push_back(v.GetString());
255 if (d.HasMember(
"required-resources") && d[
"required-resources"].IsArray()) {
256 const rapidjson::Value &a = d[
"required-resources"];
257 required_resources_ = std::vector<std::string>{};
259 required_resources_.reserve(a.Size());
260 for (
auto &v : a.GetArray()) {
261 required_resources_.push_back(v.GetString());
264 if (d.HasMember(
"acquired-resources") && d[
"acquired-resources"].IsArray()) {
265 const rapidjson::Value &a = d[
"acquired-resources"];
266 acquired_resources_ = std::vector<std::string>{};
268 acquired_resources_.reserve(a.Size());
269 for (
auto &v : a.GetArray()) {
270 acquired_resources_.push_back(v.GetString());
278 std::vector<std::string> missing;
280 missing.push_back(
"kind");
283 missing.push_back(
"apiVersion");
286 missing.push_back(
"id");
289 missing.push_back(
"type");
292 missing.push_back(
"class");
295 missing.push_back(
"mode");
298 if (!missing.empty()) {
303 std::accumulate(std::next(missing.begin()),
306 [](std::string &s,
const std::string &n) { return s +
", " + n; });
307 throw std::runtime_error(
"Goal is missing " + s);
virtual ~Goal()
Destructor.
virtual void validate(bool subcall=false) const
Validate if all required fields have been set.
virtual std::string to_json(bool pretty=false) const
Render object to JSON.
virtual void from_json(const std::string &json)
Retrieve data from JSON string.
virtual void from_json_value(const rapidjson::Value &v)
Retrieve data from JSON string.
virtual void to_json_value(rapidjson::Document &d, rapidjson::Value &v) const
Render object to JSON.