#include "option.h" #include "json.hpp" #include "tsconfig.h" #include "file_utils.h" #include Option Config::update_config(const nlohmann::json& req_json) { bool found_config = false; if(req_json.count("log-slow-requests-time-ms") != 0) { if(!req_json["log-slow-requests-time-ms"].is_number_integer()) { return Option(400, "Configuration `log-slow-requests-time-ms` must be an integer."); } set_log_slow_requests_time_ms(req_json["log-slow-requests-time-ms"].get()); found_config = true; } if(req_json.count("healthy-read-lag") != 0) { if(!req_json["healthy-read-lag"].is_number_integer()) { return Option(400, "Configuration `healthy-read-lag` must be a positive integer."); } int read_lag = req_json["healthy-read-lag"].get(); if(read_lag <= 0) { return Option(400, "Configuration `healthy-read-lag` must be a positive integer."); } set_healthy_read_lag(read_lag); found_config = true; } if(req_json.count("healthy-write-lag") != 0) { if(!req_json["healthy-write-lag"].is_number_integer()) { return Option(400, "Configuration `healthy-write-lag` must be an integer."); } size_t write_lag = req_json["healthy-write-lag"].get(); if(write_lag <= 0) { return Option(400, "Configuration `healthy-write-lag` must be a positive integer."); } set_healthy_write_lag(write_lag); found_config = true; } if(req_json.count("skip-writes") != 0) { if(!req_json["skip-writes"].is_boolean()) { return Option(400, ("Configuration `skip-writes` must be a boolean.")); } bool skip_writes = req_json["skip-writes"].get(); set_skip_writes(skip_writes); found_config = true; } return Option(true); } Option Config::fetch_file_contents(const std::string & file_path) { if(!file_exists(file_path)) { return Option(404, std::string("File does not exist at: ") + file_path); } std::ifstream infile(file_path); std::string content((std::istreambuf_iterator(infile)), (std::istreambuf_iterator())); infile.close(); return Option(content); } Option Config::fetch_nodes_config(const std::string& path_to_nodes) { std::string nodes_config; if(!path_to_nodes.empty()) { const Option & nodes_op = fetch_file_contents(path_to_nodes); if(!nodes_op.ok()) { return Option(500, "Error reading file containing nodes configuration: " + nodes_op.error()); } else { nodes_config = nodes_op.get(); if(nodes_config.empty()) { return Option(500, "File containing nodes configuration is empty."); } else { nodes_config = nodes_op.get(); } } } return Option(nodes_config); }