| 248 | } |
| 249 | |
| 250 | static IRCMessage parseMessage(const std::string &message) |
| 251 | { |
| 252 | IRCMessage parsedMessage; |
| 253 | |
| 254 | size_t idx = 0; |
| 255 | std::string rawTagsComponent; |
| 256 | std::string rawSourceComponent; |
| 257 | std::string rawCommandComponent; |
| 258 | std::string rawMessageComponent; |
| 259 | |
| 260 | if (message[idx] == '@') { |
| 261 | size_t endIdx = message.find(' '); |
| 262 | rawTagsComponent = message.substr(1, endIdx - 1); |
| 263 | idx = endIdx + 1; |
| 264 | } |
| 265 | |
| 266 | if (message[idx] == ':') { |
| 267 | idx += 1; |
| 268 | size_t endIdx = message.find(' ', idx); |
| 269 | rawSourceComponent = message.substr(idx, endIdx - idx); |
| 270 | idx = endIdx + 1; |
| 271 | } |
| 272 | |
| 273 | size_t endIdx = message.find(':', idx); |
| 274 | if (endIdx == std::string::npos) { |
| 275 | endIdx = message.length(); |
| 276 | } |
| 277 | |
| 278 | rawCommandComponent = message.substr(idx, endIdx - idx); |
| 279 | if (endIdx != message.length()) { |
| 280 | idx = endIdx + 1; |
| 281 | rawMessageComponent = message.substr(idx); |
| 282 | } |
| 283 | |
| 284 | parseTags(rawTagsComponent, parsedMessage); |
| 285 | parseSource(rawSourceComponent, parsedMessage); |
| 286 | parseCommand(rawCommandComponent, parsedMessage); |
| 287 | parsedMessage.message = rawMessageComponent; |
| 288 | return parsedMessage; |
| 289 | } |
| 290 | |
| 291 | static std::vector<IRCMessage> parseMessages(const std::string &messagesStr) |
| 292 | { |
no test coverage detected