return table.render();
}
-std::string
-Statistics::format_machine_readable(const Config& config,
- const util::TimePoint& last_updated,
- const StatisticFormat format) const
-{
- switch (format) {
- case StatisticFormat::Json:
- return Statistics::format_json(config, last_updated);
- case StatisticFormat::Tab:
- /* fall through */
- default:
- return Statistics::format_tab_separated(config, last_updated);
- }
-}
-
-std::string
-Statistics::format_tab_separated(const Config& config,
- const util::TimePoint& last_updated) const
+std::vector<std::pair<std::string, uint64_t>>
+Statistics::prepare_statistics_entries(
+ const Config& config, const util::TimePoint& last_updated) const
{
- std::vector<std::string> lines;
-
- lines.push_back(FMT("stats_updated_timestamp\t{}\n", last_updated.sec()));
-
- auto add_line = [&](auto id, auto value) {
- lines.push_back(FMT("{}\t{}\n", id, value));
- };
+ std::vector<std::pair<std::string, uint64_t>> result;
for (const auto& field : k_statistics_fields) {
if (!(field.flags & FLAG_NEVER)) {
- add_line(field.id, m_counters.get(field.statistic));
+ result.emplace_back(field.id, m_counters.get(field.statistic));
}
}
- add_line("max_cache_size_kibibyte", config.max_size() / 1024);
- add_line("max_files_in_cache", config.max_files());
+ result.emplace_back("max_cache_size_kibibyte", config.max_size() / 1024);
+ result.emplace_back("max_files_in_cache", config.max_files());
+ result.emplace_back("stats_updated_timestamp", last_updated.sec());
- std::sort(lines.begin(), lines.end());
- return util::join(lines, "");
+ std::sort(result.begin(), result.end());
+ return result;
}
std::string
-Statistics::format_json(const Config& config,
- const util::TimePoint& last_updated) const
+Statistics::format_machine_readable(const Config& config,
+ const util::TimePoint& last_updated,
+ StatisticsFormat format) const
{
- std::vector<std::string> lines;
-
- auto add_line = [&](auto id, auto value) {
- lines.push_back(FMT("\"{}\": {}", id, value));
- };
+ std::string result;
+ const auto fields = prepare_statistics_entries(config, last_updated);
- add_line("stats_updated_timestamp", last_updated.sec());
-
- for (const auto& field : k_statistics_fields) {
- if (!(field.flags & FLAG_NEVER)) {
- add_line(field.id, m_counters.get(field.statistic));
+ switch (format) {
+ case StatisticsFormat::Json:
+ result = "{";
+ for (const auto& [id, value] : fields) {
+ result.append(FMT("\n \"{}\": {},", id, value));
}
+ result.resize(result.length() - 1); // Remove trailing comma
+ result += "\n}\n";
+ break;
+ case StatisticsFormat::Tab:
+ for (const auto& [id, value] : fields) {
+ result += FMT("{}\t{}\n", id, value);
+ }
+ break;
+ default:
+ ASSERT(false);
}
- add_line("max_cache_size_kibibyte", config.max_size() / 1024);
- add_line("max_files_in_cache", config.max_files());
-
- std::sort(lines.begin(), lines.end());
- std::string result = "{\n " + util::join(lines, ",\n ") + "\n}\n";
return result;
}
-// Copyright (C) 2020-2023 Joel Rosdahl and other contributors
+// Copyright (C) 2020-2024 Joel Rosdahl and other contributors
//
// See doc/AUTHORS.adoc for a complete list of contributors.
//
#include <ctime>
#include <string>
#include <unordered_map>
+#include <utility>
#include <vector>
class Config;
// Format cache statistics in machine-readable format.
std::string format_machine_readable(const Config& config,
const util::TimePoint& last_updated,
- const StatisticFormat format) const;
+ StatisticsFormat format) const;
const StatisticsCounters& counters() const;
uint64_t count_stats(unsigned flags) const;
std::vector<std::pair<std::string, uint64_t>> get_stats(unsigned flags,
bool all) const;
- // Format cache statistics in tab-separated format.
- std::string format_tab_separated(const Config& config,
- const util::TimePoint& last_updated) const;
- // Format cache statistics in JSON format.
- std::string format_json(const Config& config,
- const util::TimePoint& last_updated) const;
+ std::vector<std::pair<std::string, uint64_t>>
+ prepare_statistics_entries(const Config& config,
+ const util::TimePoint& last_updated) const;
};
// --- Inline implementations ---