void parseMessage(StringPiece msg, size_t* threadID, size_t* messageIndex) { // Validate and strip off the message prefix and suffix constexpr StringPiece prefix{"thread "}; if (!msg.startsWith(prefix)) { throw std::runtime_error("bad message prefix"); } msg.advance(prefix.size()); if (!msg.endsWith(kMsgSuffix)) { throw std::runtime_error("bad message suffix"); } msg.subtract(kMsgSuffix.size()); // Parse then strip off the thread index auto threadIDEnd = msg.find(' '); if (threadIDEnd == StringPiece::npos) { throw std::runtime_error("no middle found"); } *threadID = folly::to<size_t>(msg.subpiece(0, threadIDEnd)); msg.advance(threadIDEnd); // Validate that the middle of the message is what we expect, // then strip it off constexpr StringPiece middle{" message "}; if (!msg.startsWith(middle)) { throw std::runtime_error("bad message middle"); } msg.advance(middle.size()); // Parse the message index *messageIndex = folly::to<size_t>(msg); }