json-partial.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #pragma once
  2. // TODO: use json_fwd.hpp when possible
  3. #include <nlohmann/json.hpp>
  4. // Healing marker (empty if the JSON was fully parsed / wasn't healed).
  5. struct common_healing_marker {
  6. // Raw marker.
  7. std::string marker;
  8. // 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).
  9. std::string json_dump_marker;
  10. };
  11. // 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)
  12. struct common_json {
  13. nlohmann::ordered_json json;
  14. common_healing_marker healing_marker;
  15. };
  16. // Parse the JSON string, healing (closing) any partial JSON if `healing_marker` is not empty.
  17. //
  18. // Healing completes partial JSON strings by adding a (possibly modified) healing marker, then whatever is needed to close the JSON.
  19. // This allows to parse the resulting healed JSON string, yet be able to cut it again if needed at the healing marker.
  20. // (this is used when parsing JSON outputs from the models, then crafting partial JSONs for the partial tool calls in OAI format).
  21. //
  22. // 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).
  23. bool common_json_parse(
  24. const std::string & input,
  25. const std::string & healing_marker,
  26. common_json & out);
  27. // Parse the JSON string (see overload above), but advancing an iterator to the end of the input when the (potentially partial) parsing succeeds.
  28. bool common_json_parse(
  29. std::string::const_iterator & it,
  30. const std::string::const_iterator & end,
  31. const std::string & healing_marker,
  32. common_json & out);