74 std::list<String> items;
81 bool has_contextual =
false;
82 for (
const auto& item : items) {
83 if (item.indexOf(
"\"context\"") >= 0) {
84 has_contextual =
true;
89 if (!has_contextual) {
91 JsonDocument json_doc;
92 JsonArray updates = json_doc[
"updates"].to<JsonArray>();
95 this->add_metadata(updates);
99 JsonObject current = updates.add<JsonObject>();
100 JsonObject source = current[
"source"].to<JsonObject>();
102 JsonArray values = current[
"values"].to<JsonArray>();
106 for (
auto it = items.rbegin(); it != items.rend(); ++it) {
107 values.add(serialized(*it));
112 serializeJson(json_doc, delta);
113 output.push_back(std::move(delta));
114 ESP_LOGD(__FILENAME__,
"delta: %s", output.back().c_str());
119 std::list<String> self_items;
120 std::map<String, std::list<String>> contextual_items;
124 for (
auto it = items.rbegin(); it != items.rend(); ++it) {
125 JsonDocument item_doc;
126 DeserializationError err = deserializeJson(item_doc, *it);
128 ESP_LOGE(__FILENAME__,
"Failed to parse buffered item: %s", err.c_str());
131 if (item_doc[
"context"].is<const char*>()) {
132 String context = item_doc[
"context"].as<String>();
134 item_doc.remove(
"context");
136 serializeJson(item_doc, value_json);
137 contextual_items[context].push_back(value_json);
139 self_items.push_back(*it);
144 if (!self_items.empty() || !meta_sent_) {
145 JsonDocument json_doc;
146 JsonArray updates = json_doc[
"updates"].to<JsonArray>();
149 this->add_metadata(updates);
152 if (!self_items.empty()) {
153 JsonObject current = updates.add<JsonObject>();
154 JsonObject source = current[
"source"].to<JsonObject>();
156 JsonArray values = current[
"values"].to<JsonArray>();
158 for (
const auto& item : self_items) {
159 values.add(serialized(item));
164 serializeJson(json_doc, delta);
165 ESP_LOGD(__FILENAME__,
"delta: %s", delta.c_str());
166 output.push_back(std::move(delta));
170 for (
const auto& [context, ctx_items] : contextual_items) {
171 JsonDocument json_doc;
172 json_doc[
"context"] = context;
173 JsonArray updates = json_doc[
"updates"].to<JsonArray>();
174 JsonObject current = updates.add<JsonObject>();
175 JsonObject source = current[
"source"].to<JsonObject>();
177 JsonArray values = current[
"values"].to<JsonArray>();
179 for (
const auto& item : ctx_items) {
180 values.add(serialized(item));
184 serializeJson(json_doc, delta);
185 ESP_LOGD(__FILENAME__,
"delta: %s", delta.c_str());
186 output.push_back(std::move(delta));