14 #include "InterfaceInfo.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;
80 v_id.SetString(*id_, allocator);
81 v.AddMember(
"id", v_id, allocator);
84 rapidjson::Value v_type;
85 v_type.SetString(*type_, allocator);
86 v.AddMember(
"type", v_type, allocator);
89 rapidjson::Value v_hash;
90 v_hash.SetString(*hash_, allocator);
91 v.AddMember(
"hash", v_hash, allocator);
94 rapidjson::Value v_writer;
95 v_writer.SetString(*writer_, allocator);
96 v.AddMember(
"writer", v_writer, allocator);
98 rapidjson::Value v_readers(rapidjson::kArrayType);
99 v_readers.Reserve(readers_.size(), allocator);
100 for (
const auto &e : readers_) {
102 v.SetString(e, allocator);
103 v_readers.PushBack(v, allocator);
105 v.AddMember(
"readers", v_readers, allocator);
106 rapidjson::Value v_fields(rapidjson::kArrayType);
107 v_fields.Reserve(fields_.size(), allocator);
108 for (
const auto &e : fields_) {
109 rapidjson::Value v(rapidjson::kObjectType);
110 e->to_json_value(d, v);
111 v_fields.PushBack(v, allocator);
113 v.AddMember(
"fields", v_fields, allocator);
114 rapidjson::Value v_message_types(rapidjson::kArrayType);
115 v_message_types.Reserve(message_types_.size(), allocator);
116 for (
const auto &e : message_types_) {
117 rapidjson::Value v(rapidjson::kObjectType);
118 e->to_json_value(d, v);
119 v_message_types.PushBack(v, allocator);
121 v.AddMember(
"message_types", v_message_types, allocator);
127 rapidjson::Document d;
136 if (d.HasMember(
"kind") && d[
"kind"].IsString()) {
137 kind_ = d[
"kind"].GetString();
139 if (d.HasMember(
"apiVersion") && d[
"apiVersion"].IsString()) {
140 apiVersion_ = d[
"apiVersion"].GetString();
142 if (d.HasMember(
"id") && d[
"id"].IsString()) {
143 id_ = d[
"id"].GetString();
145 if (d.HasMember(
"type") && d[
"type"].IsString()) {
146 type_ = d[
"type"].GetString();
148 if (d.HasMember(
"hash") && d[
"hash"].IsString()) {
149 hash_ = d[
"hash"].GetString();
151 if (d.HasMember(
"writer") && d[
"writer"].IsString()) {
152 writer_ = d[
"writer"].GetString();
154 if (d.HasMember(
"readers") && d[
"readers"].IsArray()) {
155 const rapidjson::Value &a = d[
"readers"];
156 readers_ = std::vector<std::string>{};
158 readers_.reserve(a.Size());
159 for (
auto &v : a.GetArray()) {
160 readers_.push_back(v.GetString());
163 if (d.HasMember(
"fields") && d[
"fields"].IsArray()) {
164 const rapidjson::Value &a = d[
"fields"];
165 fields_ = std::vector<std::shared_ptr<InterfaceFieldType>>{};
167 fields_.reserve(a.Size());
168 for (
auto &v : a.GetArray()) {
171 fields_.push_back(std::move(nv));
174 if (d.HasMember(
"message_types") && d[
"message_types"].IsArray()) {
175 const rapidjson::Value &a = d[
"message_types"];
176 message_types_ = std::vector<std::shared_ptr<InterfaceMessageType>>{};
178 message_types_.reserve(a.Size());
179 for (
auto &v : a.GetArray()) {
182 message_types_.push_back(std::move(nv));
190 std::vector<std::string> missing;
192 missing.push_back(
"kind");
194 missing.push_back(
"apiVersion");
196 missing.push_back(
"id");
198 missing.push_back(
"type");
200 missing.push_back(
"hash");
201 for (
size_t i = 0; i < fields_.size(); ++i) {
203 missing.push_back(
"fields[" + std::to_string(i) +
"]");
206 fields_[i]->validate(
true);
207 }
catch (std::vector<std::string> &subcall_missing) {
208 for (
const auto &s : subcall_missing) {
209 missing.push_back(
"fields[" + std::to_string(i) +
"]." + s);
214 for (
size_t i = 0; i < message_types_.size(); ++i) {
215 if (!message_types_[i]) {
216 missing.push_back(
"message_types[" + std::to_string(i) +
"]");
219 message_types_[i]->validate(
true);
220 }
catch (std::vector<std::string> &subcall_missing) {
221 for (
const auto &s : subcall_missing) {
222 missing.push_back(
"message_types[" + std::to_string(i) +
"]." + s);
228 if (!missing.empty()) {
232 std::ostringstream s;
233 s <<
"InterfaceInfo is missing field" << ((missing.size() > 0) ?
"s" :
"") <<
": ";
234 for (std::vector<std::string>::size_type i = 0; i < missing.size(); ++i) {
236 if (i < (missing.size() - 1)) {
240 throw std::runtime_error(s.str());
virtual ~InterfaceInfo()
Destructor.
InterfaceInfo()
Constructor.
InterfaceMessageType representation for JSON transfer.
virtual std::string to_json(bool pretty=false) const
Render object to JSON.
virtual void from_json_value(const rapidjson::Value &v)
Retrieve data from JSON string.
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.
std::optional< std::string > writer() const
Get writer value.
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.
virtual void validate(bool subcall=false) const
Validate if all required fields have been set.
InterfaceFieldType representation for JSON transfer.