| 13 | |
| 14 | template <typename ParserImpl> |
| 15 | std::optional<ParseResult> JSONDataParser<ParserImpl>::parse(const char * begin, size_t length) |
| 16 | { |
| 17 | std::string_view json{begin, length}; |
| 18 | Element document; |
| 19 | if (!parser.parse(json, document)) |
| 20 | return {}; |
| 21 | |
| 22 | ParseContext context; |
| 23 | traverse(document, context); |
| 24 | |
| 25 | ParseResult result; |
| 26 | result.values = std::move(context.values); |
| 27 | result.paths.reserve(context.paths.size()); |
| 28 | |
| 29 | for (auto && path : context.paths) |
| 30 | result.paths.emplace_back(std::move(path)); |
| 31 | |
| 32 | return result; |
| 33 | } |
| 34 | |
| 35 | template <typename ParserImpl> |
| 36 | void JSONDataParser<ParserImpl>::traverse(const Element & element, ParseContext & ctx) |