#pragma once #include "weaseljson.h" #include #include #include struct MinifyState { bool isKey = false; struct Cursor { int64_t index; bool isObject; }; std::string result; void on_begin_value() { if (!stack.empty()) { auto &back = stack.back(); if (back.isObject && back.index % 2 == 0 && back.index > 0) { result.append(","); } if (back.isObject && back.index % 2 == 1 && back.index > 0) { result.append(":"); } if (!back.isObject && back.index > 0) { result.append(","); } ++back.index; } } std::vector stack; }; Callbacks minifyCallbacks() { Callbacks result; result.on_begin_object = +[](void *p) { auto *state = (MinifyState *)p; state->on_begin_value(); state->stack.push_back({0, true}); state->result.append("{"); }; result.on_end_object = +[](void *p) { auto *state = (MinifyState *)p; state->stack.pop_back(); state->result.append("}"); }; result.on_begin_string = +[](void *p) { auto *state = (MinifyState *)p; state->on_begin_value(); state->result.append("\""); }; result.on_string_data = +[](void *p, const char *buf, int len) { auto *state = (MinifyState *)p; state->result.append(std::string(buf, len)); }; result.on_end_string = +[](void *p) { auto *state = (MinifyState *)p; state->result.append("\""); }; result.on_begin_array = +[](void *p) { auto *state = (MinifyState *)p; state->on_begin_value(); state->stack.push_back({0, false}); state->result.append("["); }; result.on_end_array = +[](void *p) { auto *state = (MinifyState *)p; state->stack.pop_back(); state->result.append("]"); }; result.on_begin_number = +[](void *p) { auto *state = (MinifyState *)p; state->on_begin_value(); }; result.on_number_data = +[](void *p, const char *buf, int len) { auto *state = (MinifyState *)p; state->result.append(std::string(buf, len)); }; result.on_end_number = +[](void *) {}; result.on_true_literal = +[](void *p) { auto *state = (MinifyState *)p; state->on_begin_value(); state->result.append("true"); }; result.on_false_literal = +[](void *p) { auto *state = (MinifyState *)p; state->on_begin_value(); state->result.append("false"); }; result.on_null_literal = +[](void *p) { auto *state = (MinifyState *)p; state->on_begin_value(); state->result.append("null"); }; return result; }