void preprocess_types(rapidjson::Document & d) { /// pre record types for (auto & itr : d.GetArray()) { RAPIDJSON_ASSERT(itr.HasMember("category")); RAPIDJSON_ASSERT(itr.HasMember("name")); ensure_has_array_mem(itr, "attr", d); ensure_has_array_mem(itr, "msgid", d); ensure_has_object_mem(itr, "fields", d); ensure_has_array_mem(itr, "alias", d); s_type_lists[itr.FindMember("name")->value.GetString()] = &itr; for (auto & alias : itr.FindMember("alias")->value.GetArray()) { s_alias_lists[alias.GetString()] = & itr; } s_type_order.push_back(&itr); } /// messages enum for (auto & itr : d.GetArray()) { bool has_attr_msg = false; rapidjson::Value & attr_val = itr.FindMember("attr")->value; for (auto & sattr : attr_val.GetArray()) { RAPIDJSON_ASSERT(sattr.IsString()); if (sattr == "msg") { has_attr_msg = true; attr_val.GetArray().Erase(&sattr); } else if (sattr == "export") { s_export_order.push_back(&itr); } else if (sattr == "pqxx") { add_pqxx(d, itr, true); } } rapidjson::Value & msgid_val = itr.FindMember("msgid")->value; if (has_attr_msg) { RAPIDJSON_ASSERT(itr.HasMember("name")); rapidjson::Value new_name(itr.FindMember("name")->value, d.GetAllocator()); msgid_val.PushBack(new_name, d.GetAllocator()); } for (const auto & smsgid : msgid_val.GetArray()) { RAPIDJSON_ASSERT(smsgid.IsString()); s_msg_lists[smsgid.GetString()] = &itr; } if (msgid_val.GetArray().Size() > 0) { s_msg_order.push_back(&itr); } if (msgid_val.GetArray().Size() == 0) { itr.RemoveMember("msgid"); } } for (auto i : s_pqxx_order) { std::cout << "\t" << i->FindMember("name")->value.GetString() << std::endl;; } }