From: Joel Rosdahl Date: Sat, 3 Feb 2024 09:42:29 +0000 (+0100) Subject: refactor: Simplify Statistics::format_machine_readable slightly X-Git-Tag: v4.10~113 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6006d293466ed323a0e448f71b3d86023d3fb5e2;p=thirdparty%2Fccache.git refactor: Simplify Statistics::format_machine_readable slightly --- diff --git a/src/core/Statistic.hpp b/src/core/Statistic.hpp index 26926fc02..55c30acc5 100644 --- a/src/core/Statistic.hpp +++ b/src/core/Statistic.hpp @@ -84,7 +84,7 @@ enum class Statistic { END = 84 }; -enum class StatisticFormat { +enum class StatisticsFormat { Tab, Json, }; diff --git a/src/core/Statistics.cpp b/src/core/Statistics.cpp index 3ae77ae4e..2e0d5e35e 100644 --- a/src/core/Statistics.cpp +++ b/src/core/Statistics.cpp @@ -523,69 +523,52 @@ Statistics::format_human_readable(const Config& config, 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> +Statistics::prepare_statistics_entries( + const Config& config, const util::TimePoint& last_updated) const { - std::vector 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> 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 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; } diff --git a/src/core/Statistics.hpp b/src/core/Statistics.hpp index f0951ed28..ab0a1f184 100644 --- a/src/core/Statistics.hpp +++ b/src/core/Statistics.hpp @@ -1,4 +1,4 @@ -// 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. // @@ -25,6 +25,7 @@ #include #include #include +#include #include class Config; @@ -48,7 +49,7 @@ public: // 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; @@ -62,12 +63,9 @@ private: uint64_t count_stats(unsigned flags) const; std::vector> 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> + prepare_statistics_entries(const Config& config, + const util::TimePoint& last_updated) const; }; // --- Inline implementations --- diff --git a/src/core/mainoptions.cpp b/src/core/mainoptions.cpp index 9ad83588c..acdcece47 100644 --- a/src/core/mainoptions.cpp +++ b/src/core/mainoptions.cpp @@ -500,7 +500,7 @@ process_main_options(int argc, const char* const* argv) uint8_t verbosity = 0; - StatisticFormat format = StatisticFormat::Tab; + StatisticsFormat format = StatisticsFormat::Tab; std::optional trim_max_size; std::optional trim_suffix_type; bool trim_lru_mtime = false; @@ -527,9 +527,9 @@ process_main_options(int argc, const char* const* argv) break; case FORMAT: if (arg == "tab") { - format = StatisticFormat::Tab; + format = StatisticsFormat::Tab; } else if (arg == "json") { - format = StatisticFormat::Json; + format = StatisticsFormat::Json; } else { PRINT(stderr, "Error: unknown format \"{}\"\n", arg); return EXIT_FAILURE;