14 #include "PlanAction.h" 16 #include <rapidjson/document.h> 17 #include <rapidjson/prettywriter.h> 18 #include <rapidjson/stringbuffer.h> 19 #include <rapidjson/writer.h> 44 rapidjson::Document d;
48 rapidjson::StringBuffer buffer;
50 rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);
53 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
57 return buffer.GetString();
63 rapidjson::Document::AllocatorType &allocator = d.GetAllocator();
69 rapidjson::Value v_kind;
70 v_kind.SetString(*kind_, allocator);
71 v.AddMember(
"kind", v_kind, allocator);
74 rapidjson::Value v_apiVersion;
75 v_apiVersion.SetString(*apiVersion_, allocator);
76 v.AddMember(
"apiVersion", v_apiVersion, allocator);
79 rapidjson::Value v_id;
81 v.AddMember(
"id", v_id, allocator);
84 rapidjson::Value v_operator_name;
85 v_operator_name.SetString(*operator_name_, allocator);
86 v.AddMember(
"operator-name", v_operator_name, allocator);
88 rapidjson::Value v_param_values(rapidjson::kArrayType);
89 v_param_values.Reserve(param_values_.size(), allocator);
90 for (
const auto &e : param_values_) {
92 v.SetString(e, allocator);
93 v_param_values.PushBack(v, allocator);
95 v.AddMember(
"param-values", v_param_values, allocator);
97 rapidjson::Value v_duration;
98 v_duration.SetFloat(*duration_);
99 v.AddMember(
"duration", v_duration, allocator);
101 if (dispatch_time_) {
102 rapidjson::Value v_dispatch_time;
103 v_dispatch_time.SetFloat(*dispatch_time_);
104 v.AddMember(
"dispatch-time", v_dispatch_time, allocator);
107 rapidjson::Value v_state;
108 v_state.SetString(*state_, allocator);
109 v.AddMember(
"state", v_state, allocator);
112 rapidjson::Value v_executable;
113 v_executable.SetBool(*executable_);
114 v.AddMember(
"executable", v_executable, allocator);
117 rapidjson::Value v__operator(rapidjson::kObjectType);
118 _operator_->to_json_value(d, v__operator);
119 v.AddMember(
"operator", v__operator, allocator);
121 rapidjson::Value v_preconditions(rapidjson::kArrayType);
122 v_preconditions.Reserve(preconditions_.size(), allocator);
123 for (
const auto &e : preconditions_) {
124 rapidjson::Value v(rapidjson::kObjectType);
125 e->to_json_value(d, v);
126 v_preconditions.PushBack(v, allocator);
128 v.AddMember(
"preconditions", v_preconditions, allocator);
129 rapidjson::Value v_effects(rapidjson::kArrayType);
130 v_effects.Reserve(effects_.size(), allocator);
131 for (
const auto &e : effects_) {
132 rapidjson::Value v(rapidjson::kObjectType);
133 e->to_json_value(d, v);
134 v_effects.PushBack(v, allocator);
136 v.AddMember(
"effects", v_effects, allocator);
142 rapidjson::Document d;
151 if (d.HasMember(
"kind") && d[
"kind"].IsString()) {
152 kind_ = d[
"kind"].GetString();
154 if (d.HasMember(
"apiVersion") && d[
"apiVersion"].IsString()) {
155 apiVersion_ = d[
"apiVersion"].GetString();
157 if (d.HasMember(
"id") && d[
"id"].IsInt64()) {
158 id_ = d[
"id"].GetInt64();
160 if (d.HasMember(
"operator-name") && d[
"operator-name"].IsString()) {
161 operator_name_ = d[
"operator-name"].GetString();
163 if (d.HasMember(
"param-values") && d[
"param-values"].IsArray()) {
164 const rapidjson::Value &a = d[
"param-values"];
165 param_values_ = std::vector<std::string>{};
167 param_values_.reserve(a.Size());
168 for (
auto &v : a.GetArray()) {
169 param_values_.push_back(v.GetString());
172 if (d.HasMember(
"duration") && d[
"duration"].IsFloat()) {
173 duration_ = d[
"duration"].GetFloat();
175 if (d.HasMember(
"dispatch-time") && d[
"dispatch-time"].IsFloat()) {
176 dispatch_time_ = d[
"dispatch-time"].GetFloat();
178 if (d.HasMember(
"state") && d[
"state"].IsString()) {
179 state_ = d[
"state"].GetString();
181 if (d.HasMember(
"executable") && d[
"executable"].IsBool()) {
182 executable_ = d[
"executable"].GetBool();
184 if (d.HasMember(
"operator") && d[
"operator"].IsObject()) {
185 std::shared_ptr<DomainOperator> nv{
new DomainOperator(d[
"operator"])};
186 _operator_ = std::move(nv);
188 if (d.HasMember(
"preconditions") && d[
"preconditions"].IsArray()) {
189 const rapidjson::Value &a = d[
"preconditions"];
190 preconditions_ = std::vector<std::shared_ptr<DomainPrecondition>>{};
192 preconditions_.reserve(a.Size());
193 for (
auto &v : a.GetArray()) {
196 preconditions_.push_back(std::move(nv));
199 if (d.HasMember(
"effects") && d[
"effects"].IsArray()) {
200 const rapidjson::Value &a = d[
"effects"];
201 effects_ = std::vector<std::shared_ptr<DomainEffect>>{};
203 effects_.reserve(a.Size());
204 for (
auto &v : a.GetArray()) {
207 effects_.push_back(std::move(nv));
215 std::vector<std::string> missing;
217 missing.push_back(
"kind");
219 missing.push_back(
"apiVersion");
221 missing.push_back(
"id");
223 missing.push_back(
"operator-name");
225 missing.push_back(
"state");
227 missing.push_back(
"executable");
228 for (
size_t i = 0; i < preconditions_.size(); ++i) {
229 if (!preconditions_[i]) {
230 missing.push_back(
"preconditions[" + std::to_string(i) +
"]");
233 preconditions_[i]->validate(
true);
234 }
catch (std::vector<std::string> &subcall_missing) {
235 for (
const auto &s : subcall_missing) {
236 missing.push_back(
"preconditions[" + std::to_string(i) +
"]." + s);
241 for (
size_t i = 0; i < effects_.size(); ++i) {
243 missing.push_back(
"effects[" + std::to_string(i) +
"]");
246 effects_[i]->validate(
true);
247 }
catch (std::vector<std::string> &subcall_missing) {
248 for (
const auto &s : subcall_missing) {
249 missing.push_back(
"effects[" + std::to_string(i) +
"]." + s);
255 if (!missing.empty()) {
259 std::ostringstream s;
260 s <<
"PlanAction is missing field" << ((missing.size() > 0) ?
"s" :
"") <<
": ";
261 for (std::vector<std::string>::size_type i = 0; i < missing.size(); ++i) {
263 if (i < (missing.size() - 1)) {
267 throw std::runtime_error(s.str());
virtual void from_json_value(const rapidjson::Value &v)
Retrieve data from JSON string.
DomainOperator representation for JSON transfer.
DomainEffect representation for JSON transfer.
virtual void from_json_value(const rapidjson::Value &v)
Retrieve data from JSON string.
virtual std::string to_json(bool pretty=false) const
Render object to JSON.
virtual void validate(bool subcall=false) const
Validate if all required fields have been set.
virtual void to_json_value(rapidjson::Document &d, rapidjson::Value &v) 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 ~PlanAction()
Destructor.
DomainPrecondition representation for JSON transfer.