1#pragma once
  2
  3#include "chat.h"
  4#include "peg-parser.h"
  5
  6class common_chat_peg_builder : public common_peg_parser_builder {
  7  public:
  8    static constexpr const char * REASONING_BLOCK = "reasoning-block";
  9    static constexpr const char * REASONING = "reasoning";
 10    static constexpr const char * CONTENT = "content";
 11
 12    common_peg_parser reasoning_block(const common_peg_parser & p) { return tag(REASONING_BLOCK, p); }
 13    common_peg_parser reasoning(const common_peg_parser & p) { return tag(REASONING, p); }
 14    common_peg_parser content(const common_peg_parser & p) { return tag(CONTENT, p); }
 15};
 16
 17inline common_peg_arena build_chat_peg_parser(const std::function<common_peg_parser(common_chat_peg_builder & builder)> & fn) {
 18    common_chat_peg_builder builder;
 19    builder.set_root(fn(builder));
 20    return builder.build();
 21}
 22
 23class common_chat_peg_mapper {
 24  public:
 25    common_chat_msg & result;
 26
 27    common_chat_peg_mapper(common_chat_msg & msg) : result(msg) {}
 28
 29    virtual void from_ast(const common_peg_ast_arena & arena, const common_peg_parse_result & result);
 30    virtual void map(const common_peg_ast_node & node);
 31};
 32
 33class common_chat_peg_native_builder : public common_chat_peg_builder {
 34  public:
 35    static constexpr const char * TOOL = "tool";
 36    static constexpr const char * TOOL_OPEN = "tool-open";
 37    static constexpr const char * TOOL_CLOSE = "tool-close";
 38    static constexpr const char * TOOL_ID = "tool-id";
 39    static constexpr const char * TOOL_NAME = "tool-name";
 40    static constexpr const char * TOOL_ARGS = "tool-args";
 41
 42    common_peg_parser tool(const common_peg_parser & p) { return tag(TOOL, p); }
 43    common_peg_parser tool_open(const common_peg_parser & p) { return atomic(tag(TOOL_OPEN, p)); }
 44    common_peg_parser tool_close(const common_peg_parser & p) { return atomic(tag(TOOL_CLOSE, p)); }
 45    common_peg_parser tool_id(const common_peg_parser & p) { return atomic(tag(TOOL_ID, p)); }
 46    common_peg_parser tool_name(const common_peg_parser & p) { return atomic(tag(TOOL_NAME, p)); }
 47    common_peg_parser tool_args(const common_peg_parser & p) { return tag(TOOL_ARGS, p); }
 48};
 49
 50class common_chat_peg_native_mapper : public common_chat_peg_mapper {
 51    common_chat_tool_call * current_tool;
 52
 53  public:
 54    common_chat_peg_native_mapper(common_chat_msg & msg) : common_chat_peg_mapper(msg) {}
 55
 56    void map(const common_peg_ast_node & node) override;
 57};
 58
 59inline common_peg_arena build_chat_peg_native_parser(const std::function<common_peg_parser(common_chat_peg_native_builder & builder)> & fn) {
 60    common_chat_peg_native_builder builder;
 61    builder.set_root(fn(builder));
 62    return builder.build();
 63}
 64
 65class common_chat_peg_constructed_builder : public common_chat_peg_builder {
 66  public:
 67    static constexpr const char * TOOL = "tool";
 68    static constexpr const char * TOOL_OPEN = "tool-open";
 69    static constexpr const char * TOOL_CLOSE = "tool-close";
 70    static constexpr const char * TOOL_NAME = "tool-name";
 71    static constexpr const char * TOOL_ARG = "tool-arg";
 72    static constexpr const char * TOOL_ARG_OPEN = "tool-arg-open";
 73    static constexpr const char * TOOL_ARG_CLOSE = "tool-arg-close";
 74    static constexpr const char * TOOL_ARG_NAME = "tool-arg-name";
 75    static constexpr const char * TOOL_ARG_STRING_VALUE = "tool-arg-string-value";
 76    static constexpr const char * TOOL_ARG_JSON_VALUE = "tool-arg-json-value";
 77
 78    common_peg_parser tool(const common_peg_parser & p) { return tag(TOOL, p); }
 79    common_peg_parser tool_open(const common_peg_parser & p) { return atomic(tag(TOOL_OPEN, p)); }
 80    common_peg_parser tool_close(const common_peg_parser & p) { return atomic(tag(TOOL_CLOSE, p)); }
 81    common_peg_parser tool_name(const common_peg_parser & p) { return atomic(tag(TOOL_NAME, p)); }
 82    common_peg_parser tool_arg(const common_peg_parser & p) { return tag(TOOL_ARG, p); }
 83    common_peg_parser tool_arg_open(const common_peg_parser & p) { return atomic(tag(TOOL_ARG_OPEN, p)); }
 84    common_peg_parser tool_arg_close(const common_peg_parser & p) { return atomic(tag(TOOL_ARG_CLOSE, p)); }
 85    common_peg_parser tool_arg_name(const common_peg_parser & p) { return atomic(tag(TOOL_ARG_NAME, p)); }
 86    common_peg_parser tool_arg_string_value(const common_peg_parser & p) { return tag(TOOL_ARG_STRING_VALUE, p); }
 87    common_peg_parser tool_arg_json_value(const common_peg_parser & p) { return tag(TOOL_ARG_JSON_VALUE, p); }
 88};
 89
 90class common_chat_peg_constructed_mapper : public common_chat_peg_mapper {
 91    common_chat_tool_call * current_tool;
 92    int arg_count = 0;
 93    bool needs_closing_quote = false;
 94
 95  public:
 96    common_chat_peg_constructed_mapper(common_chat_msg & msg) : common_chat_peg_mapper(msg) {}
 97
 98    void map(const common_peg_ast_node & node) override;
 99};
100
101inline common_peg_arena build_chat_peg_constructed_parser(const std::function<common_peg_parser(common_chat_peg_constructed_builder & builder)> & fn) {
102    common_chat_peg_constructed_builder builder;
103    builder.set_root(fn(builder));
104    return builder.build();
105}