summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/common/remote/remote_common.hpp81
-rw-r--r--src/buildtool/execution_api/remote/TARGETS5
-rw-r--r--src/buildtool/execution_api/remote/config.cpp86
3 files changed, 99 insertions, 73 deletions
diff --git a/src/buildtool/common/remote/remote_common.hpp b/src/buildtool/common/remote/remote_common.hpp
index be440052..f48f7fbc 100644
--- a/src/buildtool/common/remote/remote_common.hpp
+++ b/src/buildtool/common/remote/remote_common.hpp
@@ -15,9 +15,13 @@
#ifndef INCLUDED_SRC_BUILDTOOL_COMMON_REMOTE_ADDRESS_HPP
#define INCLUDED_SRC_BUILDTOOL_COMMON_REMOTE_ADDRESS_HPP
+#include <map>
#include <optional>
#include <sstream>
#include <string>
+#include <utility>
+#include <variant>
+#include <vector>
#include "fmt/core.h"
#include "nlohmann/json.hpp"
@@ -59,4 +63,81 @@ struct ServerAddress {
return std::make_pair(key, val);
}
+[[nodiscard]] static auto
+ParseDispatch(std::string const& dispatch_info) noexcept -> std::variant<
+ std::string,
+ std::vector<std::pair<std::map<std::string, std::string>, ServerAddress>>> {
+ using result_t =
+ std::variant<std::string,
+ std::vector<std::pair<std::map<std::string, std::string>,
+ ServerAddress>>>;
+ nlohmann::json dispatch;
+ try {
+ dispatch = nlohmann::json::parse(dispatch_info);
+ } catch (std::exception const& e) {
+ return result_t(
+ std::in_place_index<0>,
+ fmt::format("Failed to parse endpoint configuration: {}",
+ e.what()));
+ }
+ std::vector<std::pair<std::map<std::string, std::string>, ServerAddress>>
+ parsed{};
+ try {
+ if (not dispatch.is_array()) {
+ return result_t(std::in_place_index<0>,
+ fmt::format("Endpoint configuration has to be a "
+ "list of pairs, but found {}",
+ dispatch.dump()));
+ }
+ for (auto const& entry : dispatch) {
+ if (not(entry.is_array() and entry.size() == 2)) {
+ return result_t(
+ std::in_place_index<0>,
+ fmt::format("Endpoint configuration has to be a list of "
+ "pairs, but found entry {}",
+ entry.dump()));
+ }
+ if (not entry[0].is_object()) {
+ return result_t(std::in_place_index<0>,
+ fmt::format("Property condition has to be "
+ "given as an object, but found {}",
+ entry[0].dump()));
+ }
+ std::map<std::string, std::string> props{};
+ for (auto const& [k, v] : entry[0].items()) {
+ if (not v.is_string()) {
+ return result_t(
+ std::in_place_index<0>,
+ fmt::format("Property condition has to be given as an "
+ "object of strings but found {}",
+ entry[0].dump()));
+ }
+ props.emplace(k, v.template get<std::string>());
+ }
+ if (not entry[1].is_string()) {
+ return result_t(
+ std::in_place_index<0>,
+ fmt::format("Endpoint has to be specified as string (in "
+ "the form host:port), but found {}",
+ entry[1].dump()));
+ }
+ auto endpoint = ParseAddress(entry[1].template get<std::string>());
+ if (not endpoint) {
+ return result_t(std::in_place_index<0>,
+ fmt::format("Failed to parse {} as endpoint.",
+ entry[1].dump()));
+ }
+ parsed.emplace_back(props, *endpoint);
+ }
+ } catch (std::exception const& e) {
+ return result_t(
+ std::in_place_index<0>,
+ fmt::format("Failure analysing endpoint configuration {}: {}",
+ dispatch.dump(),
+ e.what()));
+ }
+ // success!
+ return result_t(std::in_place_index<1>, std::move(parsed));
+}
+
#endif // INCLUDED_SRC_BUILDTOOL_COMMON_REMOTE_ADDRESS_HPP
diff --git a/src/buildtool/execution_api/remote/TARGETS b/src/buildtool/execution_api/remote/TARGETS
index 3254aa3d..4e02ca89 100644
--- a/src/buildtool/execution_api/remote/TARGETS
+++ b/src/buildtool/execution_api/remote/TARGETS
@@ -80,5 +80,10 @@
, "srcs": ["config.cpp"]
, "deps": [["src/buildtool/common/remote", "remote_common"]]
, "stage": ["src", "buildtool", "execution_api", "remote"]
+ , "private-deps":
+ [ ["src/buildtool/file_system", "file_system_manager"]
+ , ["src/buildtool/logging", "log_level"]
+ , ["src/buildtool/logging", "logging"]
+ ]
}
}
diff --git a/src/buildtool/execution_api/remote/config.cpp b/src/buildtool/execution_api/remote/config.cpp
index b45f7d43..39bcebea 100644
--- a/src/buildtool/execution_api/remote/config.cpp
+++ b/src/buildtool/execution_api/remote/config.cpp
@@ -16,91 +16,31 @@
#include <exception>
#include <fstream>
+#include <utility>
#include "nlohmann/json.hpp"
+#include "src/buildtool/file_system/file_system_manager.hpp"
+#include "src/buildtool/logging/log_level.hpp"
+#include "src/buildtool/logging/logger.hpp"
[[nodiscard]] auto RemoteExecutionConfig::SetRemoteExecutionDispatch(
const std::filesystem::path& filename) noexcept -> bool {
- nlohmann::json dispatch{};
try {
- std::ifstream fs(filename);
- dispatch = nlohmann::json::parse(fs);
- } catch (std::exception const& e) {
- Logger::Log(LogLevel::Warning,
- "Failed to read json file {}: {}",
- filename.string(),
- e.what());
- return false;
- }
- std::vector<std::pair<std::map<std::string, std::string>, ServerAddress>>
- parsed{};
- try {
- if (not dispatch.is_array()) {
- Logger::Log(LogLevel::Warning,
- "Endpoint configuration has to be a list of pairs, but "
- "found {}",
- dispatch.dump());
- return false;
- }
- for (auto const& entry : dispatch) {
- if (not(entry.is_array() and entry.size() == 2)) {
- Logger::Log(
- LogLevel::Warning,
- "Endpoint configuration has to be a list of pairs, but "
- "found entry {}",
- entry.dump());
- return false;
- }
- if (not entry[0].is_object()) {
- Logger::Log(LogLevel::Warning,
- "Property condition has to be given as an object, "
- "but found {}",
- entry[0].dump());
- return false;
- }
- std::map<std::string, std::string> props{};
- for (auto const& [k, v] : entry[0].items()) {
- if (not v.is_string()) {
- Logger::Log(LogLevel::Warning,
- "Property condition has to be given as an "
- "object of strings but found {}",
- entry[0].dump());
- return false;
- }
- props.emplace(k, v.template get<std::string>());
+ if (auto dispatch_info = FileSystemManager::ReadFile(filename)) {
+ auto parsed = ParseDispatch(*dispatch_info);
+ if (parsed.index() == 0) {
+ Logger::Log(LogLevel::Warning, std::get<0>(parsed));
}
- if (not entry[1].is_string()) {
- Logger::Log(
- LogLevel::Warning,
- "Endpoint has to be specified as string (in the form "
- "host:port), but found {}",
- entry[1].dump());
- return false;
- }
- auto endpoint = ParseAddress(entry[1].template get<std::string>());
- if (not endpoint) {
- Logger::Log(LogLevel::Warning,
- "Failed to parse {} as endpoint.",
- entry[1].dump());
- return false;
- }
- parsed.emplace_back(props, *endpoint);
+ Instance().dispatch_ = std::move(std::get<1>(parsed));
+ return true;
}
- } catch (std::exception const& e) {
Logger::Log(LogLevel::Warning,
- "Failure analysing endpoint configuration {}: {}",
- dispatch.dump(),
- e.what());
- return false;
- }
-
- try {
- Instance().dispatch_ = parsed;
+ "Failed to read json file {}",
+ filename.string());
} catch (std::exception const& e) {
Logger::Log(LogLevel::Warning,
"Failure assigning the endpoint configuration: {}",
e.what());
- return false;
}
- return true;
+ return false;
}