| 1 | #pragma once |
| 2 | |
| 3 | #include <nlohmann/json.hpp> |
| 4 | |
| 5 | // Healing marker (empty if the JSON was fully parsed / wasn't healed). |
| 6 | struct common_healing_marker { |
| 7 | // Raw marker. |
| 8 | std::string marker; |
| 9 | |
| 10 | // Cutting the `common_json.json.dump()` string at the (only) occurrence of this marker should yield the original partial JSON string (modulo spaces / if it had the same dump format). |
| 11 | std::string json_dump_marker; |
| 12 | }; |
| 13 | |
| 14 | // Represents a parsed JSON object, with its optional healing marker (a JSON dump fragment that can be used to find the position of healing in the JSON dump string) |
| 15 | struct common_json { |
| 16 | nlohmann::ordered_json json; |
| 17 | |
| 18 | common_healing_marker healing_marker; |
| 19 | }; |
| 20 | |
| 21 | // Parse the JSON string, healing (closing) any partial JSON if `healing_marker` is not empty. |
| 22 | // |
| 23 | // Healing completes partial JSON strings by adding a (possibly modified) healing marker, then whatever is needed to close the JSON. |
| 24 | // This allows to parse the resulting healed JSON string, yet be able to cut it again if needed at the healing marker. |
| 25 | // (this is used when parsing JSON outputs from the models, then crafting partial JSONs for the partial tool calls in OAI format). |
| 26 | // |
| 27 | // For instance, parsing `{` with a healing marker `foo` will produce a healed JSON `{"foo":1}`, w/ json_dump_marker = `"foo"` (which can be used to break the JSON again). |
| 28 | bool common_json_parse( |
| 29 | const std::string & input, |
| 30 | const std::string & healing_marker, |
| 31 | common_json & out); |
| 32 | |
| 33 | // Parse the JSON string (see overload above), but advancing an iterator to the end of the input when the (potentially partial) parsing succeeds. |
| 34 | bool common_json_parse( |
| 35 | std::string::const_iterator & it, |
| 36 | const std::string::const_iterator & end, |
| 37 | const std::string & healing_marker, |
| 38 | common_json & out); |
| 39 | |