summaryrefslogtreecommitdiff
path: root/src/other_tools/utils
diff options
context:
space:
mode:
authorMaksim Denisov <denisov.maksim@huawei.com>2024-09-11 11:59:52 +0200
committerMaksim Denisov <denisov.maksim@huawei.com>2024-09-11 14:52:07 +0200
commit7c476a707544f2de6ed7ecc296eb08591ca1a691 (patch)
tree99ccf450cb367f444a99b69b8c3ab507bb4c79a5 /src/other_tools/utils
parentb81206fe9885ed9f6fb0426d91ac607f7d8393c3 (diff)
downloadjustbuild-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/TARGETS1
-rw-r--r--src/other_tools/utils/parse_archive.cpp58
-rw-r--r--src/other_tools/utils/parse_archive.hpp5
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