| 195 | } |
| 196 | |
| 197 | std::optional<std::string> Replace(std::string_view s, std::string_view token, |
| 198 | std::string_view replacement) { |
| 199 | size_t token_start = s.find(token); |
| 200 | if (token_start == std::string::npos) { |
| 201 | return std::nullopt; |
| 202 | } |
| 203 | return std::string(s.substr(0, token_start)) + std::string(replacement) + |
| 204 | std::string(s.substr(token_start + token.size())); |
| 205 | } |
| 206 | |
| 207 | Result<bool> ParseBoolean(std::string_view value) { |
| 208 | if (AsciiEqualsCaseInsensitive(value, "true") || value == "1") { |