| 69 | )"; |
| 70 | |
| 71 | static std::optional<EffectInfo> parseEffect(const rapidjson::Value& effectObj) { |
| 72 | if (!effectObj.HasMember("product") || |
| 73 | !effectObj.HasMember("iconImageUrl") || |
| 74 | !effectObj["product"].HasMember("code") || |
| 75 | !effectObj["product"].HasMember("title") || |
| 76 | !effectObj["product"].HasMember("subtitle")) { |
| 77 | assert(false); |
| 78 | return std::nullopt; |
| 79 | } |
| 80 | |
| 81 | return EffectInfo { |
| 82 | effectObj["iconImageUrl"].GetString(), |
| 83 | effectObj["product"]["code"].GetString(), |
| 84 | effectObj["product"]["title"].GetString(), |
| 85 | effectObj["product"]["subtitle"].GetString(), |
| 86 | }; |
| 87 | } |
| 88 | |
| 89 | static std::optional<EffectsGroup> parseEffectGroup(const rapidjson::Value& groupObj) { |
| 90 | if (!groupObj.HasMember("title") || |
no test coverage detected