39 void WriteEnum(google::protobuf::EnumValueDescriptor
const* value) {
_writer.String(value->name()); }
41 void WriteMessage(google::protobuf::Message
const& value);
46 void WriteMessageField(google::protobuf::Message
const& value, google::protobuf::FieldDescriptor
const* field);
47 void WriteSimpleMessageField(google::protobuf::Message
const& value, google::protobuf::FieldDescriptor
const* field);
51 rapidjson::Writer<rapidjson::StringBuffer>
_writer;
56 google::protobuf::Reflection
const* reflection = value.GetReflection();
57 std::vector<google::protobuf::FieldDescriptor const*> fields;
58 reflection->ListFields(value, &fields);
61 for (std::size_t i = 0; i < fields.size(); ++i)
82 google::protobuf::Reflection
const* reflection = value.GetReflection();
83 switch (field->cpp_type())
85 case google::protobuf::FieldDescriptor::CPPTYPE_INT32:
86 WriteInt32(reflection->GetInt32(value, field));
88 case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
89 WriteInt64(reflection->GetInt64(value, field));
91 case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
94 case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
97 case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE:
100 case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
101 WriteFloat(reflection->GetFloat(value, field));
103 case google::protobuf::FieldDescriptor::CPPTYPE_BOOL:
104 WriteBool(reflection->GetBool(value, field));
106 case google::protobuf::FieldDescriptor::CPPTYPE_ENUM:
107 WriteEnum(reflection->GetEnum(value, field));
109 case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
111 std::string strValue = reflection->GetString(value, field);
112 if (field->type() == google::protobuf::FieldDescriptor::TYPE_STRING)
117 for (std::size_t i = 0; i < strValue.length(); ++i)
123 case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE:
133 google::protobuf::Reflection
const* reflection = value.GetReflection();
134 for (
int32 i = 0; i < reflection->FieldSize(value, field); ++i)
136 switch (field->cpp_type())
138 case google::protobuf::FieldDescriptor::CPPTYPE_INT32:
139 WriteInt32(reflection->GetRepeatedInt32(value, field, i));
141 case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
142 WriteInt64(reflection->GetRepeatedInt64(value, field, i));
144 case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
145 WriteUInt32(reflection->GetRepeatedUInt32(value, field, i));
147 case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
148 WriteUInt64(reflection->GetRepeatedUInt64(value, field, i));
150 case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE:
151 WriteDouble(reflection->GetRepeatedDouble(value, field, i));
153 case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
154 WriteFloat(reflection->GetRepeatedFloat(value, field, i));
156 case google::protobuf::FieldDescriptor::CPPTYPE_BOOL:
157 WriteBool(reflection->GetRepeatedBool(value, field, i));
159 case google::protobuf::FieldDescriptor::CPPTYPE_ENUM:
160 WriteEnum(reflection->GetRepeatedEnum(value, field, i));
162 case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
164 std::string strValue = reflection->GetRepeatedString(value, field, i);
165 if (field->type() == google::protobuf::FieldDescriptor::TYPE_STRING)
170 for (std::size_t j = 0; j < strValue.length(); ++j)
176 case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE:
177 WriteMessage(reflection->GetRepeatedMessage(value, field, i));
185class Deserializer :
public rapidjson::BaseReaderHandler<rapidjson::UTF8<>, Deserializer>
188 bool ReadMessage(std::string
const& json, google::protobuf::Message* message);
190 bool Key(Ch
const* str, rapidjson::SizeType length,
bool copy);
198 bool String(Ch
const* str, rapidjson::SizeType length,
bool copy);
200 bool EndObject(rapidjson::SizeType memberCount);
202 bool EndArray(rapidjson::SizeType memberCount);
207 bool CheckType(google::protobuf::FieldDescriptor::CppType expectedType);
210 std::stack<google::protobuf::FieldDescriptor const*>
_state;
276 google::protobuf::FieldDescriptor
const* field =
_state.top();
277 google::protobuf::Message* message =
_objectState.top();
278 switch (field->cpp_type())
280 case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
283 case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
285 if (field->type() != google::protobuf::FieldDescriptor::TYPE_BYTES)
287 _errors.emplace_back(
"Expected field type to be bytes but got string instead.");
290 std::string currentValue = message->GetReflection()->GetString(*message, field);
291 currentValue.append(1, (
char)i);
292 message->GetReflection()->SetString(message, field, currentValue);
343 google::protobuf::FieldDescriptor
const* field =
_state.top();
344 google::protobuf::Message* message =
_objectState.top();
345 switch (field->cpp_type())
347 case google::protobuf::FieldDescriptor::CPPTYPE_ENUM:
349 google::protobuf::EnumValueDescriptor
const* enumValue = field->enum_type()->FindValueByName(str);
352 _errors.push_back(
Trinity::StringFormat(
"Field {} enum {} does not have a value named {}.", field->full_name(), field->enum_type()->full_name(), str));
356 SET_FIELD(message, field, Enum, enumValue);
359 case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
375 if (
_state.top()->cpp_type() != google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE)
381 google::protobuf::Message* containingMessage =
_objectState.top();
382 if (!
_state.top()->is_repeated())
383 _objectState.push(containingMessage->GetReflection()->MutableMessage(containingMessage,
_state.top()));
385 _objectState.push(containingMessage->GetReflection()->AddMessage(containingMessage,
_state.top()));