feat:export data while running or close
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
|
||||
#include "components/ffmsep/cpstream_core.hh"
|
||||
|
||||
#include <algorithm>
|
||||
#include <chrono>
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
@@ -19,6 +20,73 @@ namespace {
|
||||
|
||||
using nlohmann::json;
|
||||
|
||||
bool is_simple_array(const json& value) {
|
||||
if (!value.is_array()) {
|
||||
return false;
|
||||
}
|
||||
return std::all_of(value.begin(), value.end(), [](const json& item) {
|
||||
return item.is_primitive();
|
||||
});
|
||||
}
|
||||
|
||||
void dump_compact_json(std::ostream& out,
|
||||
const json& value,
|
||||
int indent = 0,
|
||||
int indent_step = 2) {
|
||||
const auto indent_str = std::string(static_cast<std::size_t>(indent), ' ');
|
||||
const auto child_indent = indent + indent_step;
|
||||
const auto child_indent_str = std::string(static_cast<std::size_t>(child_indent), ' ');
|
||||
|
||||
if (value.is_object()) {
|
||||
out << "{\n";
|
||||
bool first = true;
|
||||
for (auto it = value.begin(); it != value.end(); ++it) {
|
||||
if (!first) {
|
||||
out << ",\n";
|
||||
}
|
||||
first = false;
|
||||
out << child_indent_str << json(it.key()).dump() << ": ";
|
||||
dump_compact_json(out, it.value(), child_indent, indent_step);
|
||||
}
|
||||
out << '\n' << indent_str << '}';
|
||||
return;
|
||||
}
|
||||
|
||||
if (value.is_array()) {
|
||||
if (value.empty()) {
|
||||
out << "[]";
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_simple_array(value)) {
|
||||
out << '[';
|
||||
for (std::size_t idx = 0; idx < value.size(); ++idx) {
|
||||
if (idx != 0U) {
|
||||
out << ", ";
|
||||
}
|
||||
out << value[static_cast<json::size_type>(idx)].dump();
|
||||
}
|
||||
out << ']';
|
||||
return;
|
||||
}
|
||||
|
||||
out << "[\n";
|
||||
bool first = true;
|
||||
for (const auto& item : value) {
|
||||
if (!first) {
|
||||
out << ",\n";
|
||||
}
|
||||
first = false;
|
||||
out << child_indent_str;
|
||||
dump_compact_json(out, item, child_indent, indent_step);
|
||||
}
|
||||
out << '\n' << indent_str << ']';
|
||||
return;
|
||||
}
|
||||
|
||||
out << value.dump();
|
||||
}
|
||||
|
||||
json serialize_tactile_frame(const DecodedFrame& frame) {
|
||||
json result = {
|
||||
{"pts", frame.pts},
|
||||
@@ -165,7 +233,8 @@ WriteResult JsonWritter::write_once(const std::string& path,
|
||||
return {false, "failed to open export file", path};
|
||||
}
|
||||
|
||||
stream << std::setw(2) << root;
|
||||
dump_compact_json(stream, root);
|
||||
stream << '\n';
|
||||
stream.flush();
|
||||
if (!stream.good()) {
|
||||
return {false, "failed to write export file", path};
|
||||
|
||||
Reference in New Issue
Block a user