14 #include "GroundedFormula.h"
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_name;
81 v_name.SetString(*name_, allocator);
82 v.AddMember(
"name", v_name, allocator);
85 rapidjson::Value v_type;
86 v_type.SetString(*type_, allocator);
87 v.AddMember(
"type", v_type, allocator);
90 rapidjson::Value v_is_satisfied;
91 v_is_satisfied.SetBool(*is_satisfied_);
92 v.AddMember(
"is-satisfied", v_is_satisfied, allocator);
94 rapidjson::Value v_param_names(rapidjson::kArrayType);
95 v_param_names.Reserve(param_names_.size(), allocator);
96 for (
const auto &e : param_names_) {
98 v.SetString(e, allocator);
99 v_param_names.PushBack(v, allocator);
101 v.AddMember(
"param-names", v_param_names, allocator);
102 rapidjson::Value v_param_values(rapidjson::kArrayType);
103 v_param_values.Reserve(param_values_.size(), allocator);
104 for (
const auto &e : param_values_) {
106 v.SetString(e, allocator);
107 v_param_values.PushBack(v, allocator);
109 v.AddMember(
"param-values", v_param_values, allocator);
110 rapidjson::Value v_param_constants(rapidjson::kArrayType);
111 v_param_constants.Reserve(param_constants_.size(), allocator);
112 for (
const auto &e : param_constants_) {
114 v.SetString(e, allocator);
115 v_param_constants.PushBack(v, allocator);
117 v.AddMember(
"param-constants", v_param_constants, allocator);
118 rapidjson::Value v_child(rapidjson::kArrayType);
119 v_child.Reserve(child_.size(), allocator);
120 for (
const auto &e : child_) {
121 rapidjson::Value v(rapidjson::kObjectType);
122 e->to_json_value(d, v);
123 v_child.PushBack(v, allocator);
125 v.AddMember(
"child", v_child, allocator);
131 rapidjson::Document d;
140 if (d.HasMember(
"kind") && d[
"kind"].IsString()) {
141 kind_ = d[
"kind"].GetString();
143 if (d.HasMember(
"apiVersion") && d[
"apiVersion"].IsString()) {
144 apiVersion_ = d[
"apiVersion"].GetString();
146 if (d.HasMember(
"name") && d[
"name"].IsString()) {
147 name_ = d[
"name"].GetString();
149 if (d.HasMember(
"type") && d[
"type"].IsString()) {
150 type_ = d[
"type"].GetString();
152 if (d.HasMember(
"is-satisfied") && d[
"is-satisfied"].IsBool()) {
153 is_satisfied_ = d[
"is-satisfied"].GetBool();
155 if (d.HasMember(
"param-names") && d[
"param-names"].IsArray()) {
156 const rapidjson::Value &a = d[
"param-names"];
157 param_names_ = std::vector<std::string>{};
159 param_names_.reserve(a.Size());
160 for (
auto &v : a.GetArray()) {
161 param_names_.push_back(v.GetString());
164 if (d.HasMember(
"param-values") && d[
"param-values"].IsArray()) {
165 const rapidjson::Value &a = d[
"param-values"];
166 param_values_ = std::vector<std::string>{};
168 param_values_.reserve(a.Size());
169 for (
auto &v : a.GetArray()) {
170 param_values_.push_back(v.GetString());
173 if (d.HasMember(
"param-constants") && d[
"param-constants"].IsArray()) {
174 const rapidjson::Value &a = d[
"param-constants"];
175 param_constants_ = std::vector<std::string>{};
177 param_constants_.reserve(a.Size());
178 for (
auto &v : a.GetArray()) {
179 param_constants_.push_back(v.GetString());
182 if (d.HasMember(
"child") && d[
"child"].IsArray()) {
183 const rapidjson::Value &a = d[
"child"];
184 child_ = std::vector<std::shared_ptr<GroundedFormula>>{};
186 child_.reserve(a.Size());
187 for (
auto &v : a.GetArray()) {
189 nv->from_json_value(v);
190 child_.push_back(std::move(nv));
198 std::vector<std::string> missing;
200 missing.push_back(
"kind");
203 missing.push_back(
"apiVersion");
206 missing.push_back(
"name");
209 missing.push_back(
"type");
211 if (!is_satisfied_) {
212 missing.push_back(
"is-satisfied");
215 if (!missing.empty()) {
220 std::accumulate(std::next(missing.begin()),
223 [](std::string &s,
const std::string &n) { return s +
", " + n; });
224 throw std::runtime_error(
"GroundedFormula is missing " + s);