diff options
author | Maksim Denisov <denisov.maksim@huawei.com> | 2024-09-11 11:59:52 +0200 |
---|---|---|
committer | Maksim Denisov <denisov.maksim@huawei.com> | 2024-09-11 14:52:07 +0200 |
commit | 7c476a707544f2de6ed7ecc296eb08591ca1a691 (patch) | |
tree | 99ccf450cb367f444a99b69b8c3ab507bb4c79a5 /src/other_tools/utils | |
parent | b81206fe9885ed9f6fb0426d91ac607f7d8393c3 (diff) | |
download | justbuild-7c476a707544f2de6ed7ecc296eb08591ca1a691.tar.gz |
Move ParseArchiveContent function to the header
...to remove code duplications in ReposToSetupMap.
Diffstat (limited to 'src/other_tools/utils')
-rw-r--r-- | src/other_tools/utils/TARGETS | 1 | ||||
-rw-r--r-- | src/other_tools/utils/parse_archive.cpp | 58 | ||||
-rw-r--r-- | src/other_tools/utils/parse_archive.hpp | 5 |
3 files changed, 29 insertions, 35 deletions
diff --git a/src/other_tools/utils/TARGETS b/src/other_tools/utils/TARGETS index 27cbb93d..9d4e5734 100644 --- a/src/other_tools/utils/TARGETS +++ b/src/other_tools/utils/TARGETS @@ -60,6 +60,7 @@ , "deps": [ ["src/buildtool/build_engine/expression", "expression"] , ["src/other_tools/ops_maps", "content_cas_map"] + , ["src/utils/cpp", "expected"] ] , "private-deps": [["@", "fmt", "", "fmt"]] , "stage": ["src", "other_tools", "utils"] diff --git a/src/other_tools/utils/parse_archive.cpp b/src/other_tools/utils/parse_archive.cpp index 1aebe239..a8fc1830 100644 --- a/src/other_tools/utils/parse_archive.cpp +++ b/src/other_tools/utils/parse_archive.cpp @@ -18,38 +18,28 @@ #include "fmt/core.h" -namespace { auto ParseArchiveContent(ExpressionPtr const& repo_desc, - std::string const& origin, - const AsyncMapConsumerLoggerPtr& logger) - -> std::optional<ArchiveContent> { - + std::string const& origin) + -> expected<ArchiveContent, std::string> { // enforce mandatory fields auto repo_desc_content = repo_desc->At("content"); if (not repo_desc_content) { - (*logger)("ArchiveCheckout: Mandatory field \"content\" is missing", - /*fatal=*/true); - return std::nullopt; + return unexpected<std::string>{ + "Mandatory field \"content\" is missing"}; } if (not repo_desc_content->get()->IsString()) { - (*logger)(fmt::format("ArchiveCheckout: Unsupported value {} for " - "mandatory field \"content\"", - repo_desc_content->get()->ToString()), - /*fatal=*/true); - return std::nullopt; + return unexpected{ + fmt::format("Unsupported value {} for mandatory field \"content\"", + repo_desc_content->get()->ToString())}; } auto repo_desc_fetch = repo_desc->At("fetch"); if (not repo_desc_fetch) { - (*logger)("ArchiveCheckout: Mandatory field \"fetch\" is missing", - /*fatal=*/true); - return std::nullopt; + return unexpected<std::string>{"Mandatory field \"fetch\" is missing"}; } if (not repo_desc_fetch->get()->IsString()) { - (*logger)(fmt::format("ArchiveCheckout: Unsupported value {} for " - "mandatory field \"fetch\"", - repo_desc_fetch->get()->ToString()), - /*fatal=*/true); - return std::nullopt; + return unexpected{ + fmt::format("Unsupported value {} for mandatory field \"fetch\"", + repo_desc_fetch->get()->ToString())}; } auto repo_desc_distfile = repo_desc->Get("distfile", Expression::none_t{}); auto repo_desc_sha256 = repo_desc->Get("sha256", Expression::none_t{}); @@ -61,21 +51,18 @@ auto ParseArchiveContent(ExpressionPtr const& repo_desc, mirrors.reserve(repo_desc_mirrors->List().size()); for (auto const& elem : repo_desc_mirrors->List()) { if (not elem->IsString()) { - (*logger)(fmt::format("ArchiveCheckout: Unsupported list entry " - "{} in optional field \"mirrors\"", - elem->ToString()), - /*fatal=*/true); - return std::nullopt; + return unexpected{fmt::format( + "Unsupported list entry {} in optional field \"mirrors\"", + elem->ToString())}; } mirrors.emplace_back(elem->String()); } } else { - (*logger)(fmt::format("ArchiveCheckout: Optional field \"mirrors\" " - "should be a list of strings, but found: {}", - repo_desc_mirrors->ToString()), - /*fatal=*/true); - return std::nullopt; + return unexpected{ + fmt::format("Optional field \"mirrors\" should be a list of " + "strings, but found: {}", + repo_desc_mirrors->ToString())}; } return ArchiveContent{ @@ -104,15 +91,15 @@ auto IsValidFileName(const std::string& s) -> bool { return true; } -} // namespace - auto ParseArchiveDescription(ExpressionPtr const& repo_desc, std::string const& repo_type, std::string const& origin, const AsyncMapConsumerLoggerPtr& logger) -> std::optional<ArchiveRepoInfo> { - auto archive_content = ParseArchiveContent(repo_desc, origin, logger); + auto const archive_content = ParseArchiveContent(repo_desc, origin); if (not archive_content) { + (*logger)(fmt::format("ArchiveCheckout: {}", archive_content.error()), + /*fatal=*/true); return std::nullopt; } // additional mandatory fields @@ -151,8 +138,9 @@ auto ParseForeignFileDescription(ExpressionPtr const& repo_desc, std::string const& origin, const AsyncMapConsumerLoggerPtr& logger) -> std::optional<ForeignFileInfo> { - auto archive_content = ParseArchiveContent(repo_desc, origin, logger); + auto const archive_content = ParseArchiveContent(repo_desc, origin); if (not archive_content) { + (*logger)(archive_content.error(), /*fatal=*/true); return std::nullopt; } auto name = repo_desc->At("name"); diff --git a/src/other_tools/utils/parse_archive.hpp b/src/other_tools/utils/parse_archive.hpp index 6d356dd4..bf7f02fc 100644 --- a/src/other_tools/utils/parse_archive.hpp +++ b/src/other_tools/utils/parse_archive.hpp @@ -20,6 +20,11 @@ #include "src/buildtool/build_engine/expression/expression.hpp" #include "src/other_tools/ops_maps/content_cas_map.hpp" +#include "src/utils/cpp/expected.hpp" + +auto ParseArchiveContent(ExpressionPtr const& repo_desc, + std::string const& origin) + -> expected<ArchiveContent, std::string>; // Parse the description of an archive repository; if an error // occurs, call the logger with fatal set to true and return std::nullopt |