From f890172431366403111a707386d105e33f467b91 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Fri, 15 Aug 2025 22:48:40 -0400 Subject: [PATCH] Generic config parsing utilities --- src/config.cpp | 87 ++++++++++++++++++++++++++------------------------ src/config.hpp | 13 ++++++++ 2 files changed, 58 insertions(+), 42 deletions(-) diff --git a/src/config.cpp b/src/config.cpp index cffc05c..b6432c8 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -40,58 +40,61 @@ ConfigParser::parse_toml_string(const std::string &toml_content) { } } +// Generic configuration parsing utilities +template +void ConfigParser::parse_field(const auto §ion, + const std::string &field_name, T &target) { + if (section.contains(field_name)) { + target = toml::get(section.at(field_name)); + } +} + +template +void ConfigParser::parse_duration_field( + const auto §ion, const std::string &field_name, + std::chrono::duration &target) { + if (section.contains(field_name)) { + auto value = toml::get(section.at(field_name)); + target = std::chrono::duration{value}; + } +} + +void ConfigParser::parse_section(const auto &toml_data, + const std::string §ion_name, + auto parse_func) { + if (toml_data.contains(section_name)) { + const auto §ion = toml_data.at(section_name); + parse_func(section); + } +} + void ConfigParser::parse_server_config(const auto &toml_data, ServerConfig &config) { - if (toml_data.contains("server")) { - const auto &srv = toml_data.at("server"); - - if (srv.contains("bind_address")) { - config.bind_address = toml::get(srv.at("bind_address")); - } - if (srv.contains("port")) { - config.port = toml::get(srv.at("port")); - } - if (srv.contains("max_request_size_bytes")) { - config.max_request_size_bytes = - toml::get(srv.at("max_request_size_bytes")); - } - } + parse_section(toml_data, "server", [&](const auto &srv) { + parse_field(srv, "bind_address", config.bind_address); + parse_field(srv, "port", config.port); + parse_field(srv, "max_request_size_bytes", config.max_request_size_bytes); + }); } void ConfigParser::parse_commit_config(const auto &toml_data, CommitConfig &config) { - if (toml_data.contains("commit")) { - const auto &commit = toml_data.at("commit"); - - if (commit.contains("min_request_id_length")) { - config.min_request_id_length = - toml::get(commit.at("min_request_id_length")); - } - if (commit.contains("request_id_retention_hours")) { - auto hours = toml::get(commit.at("request_id_retention_hours")); - config.request_id_retention_time = std::chrono::hours{hours}; - } - if (commit.contains("request_id_retention_versions")) { - config.request_id_retention_versions = - toml::get(commit.at("request_id_retention_versions")); - } - } + parse_section(toml_data, "commit", [&](const auto &commit) { + parse_field(commit, "min_request_id_length", config.min_request_id_length); + parse_duration_field(commit, "request_id_retention_hours", + config.request_id_retention_time); + parse_field(commit, "request_id_retention_versions", + config.request_id_retention_versions); + }); } void ConfigParser::parse_subscription_config(const auto &toml_data, SubscriptionConfig &config) { - if (toml_data.contains("subscription")) { - const auto &sub = toml_data.at("subscription"); - - if (sub.contains("max_buffer_size_bytes")) { - config.max_buffer_size_bytes = - toml::get(sub.at("max_buffer_size_bytes")); - } - if (sub.contains("keepalive_interval_seconds")) { - auto seconds = toml::get(sub.at("keepalive_interval_seconds")); - config.keepalive_interval = std::chrono::seconds{seconds}; - } - } + parse_section(toml_data, "subscription", [&](const auto &sub) { + parse_field(sub, "max_buffer_size_bytes", config.max_buffer_size_bytes); + parse_duration_field(sub, "keepalive_interval_seconds", + config.keepalive_interval); + }); } } // namespace weaseldb \ No newline at end of file diff --git a/src/config.hpp b/src/config.hpp index 8c1e63b..4333073 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -40,6 +40,19 @@ public: parse_toml_string(const std::string &toml_content); private: + // Generic configuration parsing utilities + template + static void parse_field(const auto §ion, const std::string &field_name, + T &target); + + template + static void parse_duration_field(const auto §ion, + const std::string &field_name, + std::chrono::duration &target); + + static void parse_section(const auto &toml_data, + const std::string §ion_name, auto parse_func); + static void parse_server_config(const auto &toml_data, ServerConfig &config); static void parse_commit_config(const auto &toml_data, CommitConfig &config); static void parse_subscription_config(const auto &toml_data,