diff options
author | Maksim Denisov <denisov.maksim@huawei.com> | 2024-11-26 12:45:12 +0100 |
---|---|---|
committer | Maksim Denisov <denisov.maksim@huawei.com> | 2024-11-27 10:58:41 +0100 |
commit | 99484594466469820ef8f2c4ceee25420b90dd6f (patch) | |
tree | 73fb6b7915de0c651fc48ebafc8c529f1534e364 /src/other_tools/utils | |
parent | c640e12f066efd28de8c001fa314469b3704252a (diff) | |
download | justbuild-99484594466469820ef8f2c4ceee25420b90dd6f.tar.gz |
JustMR: Parse computed repositories
Diffstat (limited to 'src/other_tools/utils')
-rw-r--r-- | src/other_tools/utils/TARGETS | 18 | ||||
-rw-r--r-- | src/other_tools/utils/parse_computed_root.cpp | 86 | ||||
-rw-r--r-- | src/other_tools/utils/parse_computed_root.hpp | 49 |
3 files changed, 153 insertions, 0 deletions
diff --git a/src/other_tools/utils/TARGETS b/src/other_tools/utils/TARGETS index d568b7e4..efeb5494 100644 --- a/src/other_tools/utils/TARGETS +++ b/src/other_tools/utils/TARGETS @@ -95,4 +95,22 @@ ] , "stage": ["src", "other_tools", "utils"] } +, "parse_computed_root": + { "type": ["@", "rules", "CC", "library"] + , "name": ["parse_computed_root"] + , "hdrs": ["parse_computed_root.hpp"] + , "srcs": ["parse_computed_root.cpp"] + , "deps": + [ ["@", "gsl", "", "gsl"] + , ["src/buildtool/build_engine/expression", "expression_ptr_interface"] + , ["src/buildtool/file_system", "file_root"] + , ["src/utils/cpp", "expected"] + ] + , "private-deps": + [ ["@", "fmt", "", "fmt"] + , ["@", "json", "", "json"] + , ["src/buildtool/build_engine/expression", "expression"] + ] + , "stage": ["src", "other_tools", "utils"] + } } diff --git a/src/other_tools/utils/parse_computed_root.cpp b/src/other_tools/utils/parse_computed_root.cpp new file mode 100644 index 00000000..ccc01d92 --- /dev/null +++ b/src/other_tools/utils/parse_computed_root.cpp @@ -0,0 +1,86 @@ +// Copyright 2024 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/other_tools/utils/parse_computed_root.hpp" + +#include "fmt/core.h" +#include "nlohmann/json.hpp" +#include "src/buildtool/build_engine/expression/expression.hpp" + +auto ComputedRootParser::Create( + gsl::not_null<ExpressionPtr const*> const& repository) noexcept + -> std::optional<ComputedRootParser> { + if (not repository->IsNotNull() or not(*repository)->IsMap()) { + return std::nullopt; + } + try { + auto const type = (*repository)->Get("type", Expression::none_t{}); + if (type.IsNotNull() and type->IsString() and + type->String() == "computed") { + return ComputedRootParser{repository}; + } + } catch (...) { + return std::nullopt; + } + return std::nullopt; +} + +auto ComputedRootParser::GetTargetRepository() const + -> expected<std::string, std::string> { + auto const repo = repository_->Get("repo", Expression::none_t{}); + if (not repo.IsNotNull()) { + return unexpected<std::string>{"Mandatory key \"repo\" is missing"}; + } + if (not repo->IsString()) { + return unexpected{fmt::format("Unsupported value {} for key \"repo\".", + repo->ToString())}; + } + return repo->String(); +} + +auto ComputedRootParser::GetResult() const + -> expected<FileRoot::ComputedRoot, std::string> { + auto const repo = GetTargetRepository(); + if (not repo) { + return unexpected{repo.error()}; + } + + auto const target = repository_->Get("target", Expression::none_t{}); + if (not target.IsNotNull()) { + return unexpected<std::string>{"Mandatory key \"target\" is missing"}; + } + if (not target->IsList() or target->List().size() != 2) { + return unexpected{fmt::format("Unsupported value {} for key \"target\"", + target->ToString())}; + } + auto const& target_list = target->List(); + auto const target_module = target_list.at(0); + auto const target_name = target_list.at(1); + if (not target_module->IsString() or not target_name->IsString()) { + return unexpected{fmt::format( + "Unsupported format {} for key \"target\"", target->ToString())}; + } + + auto const config = repository_->Get("config", Expression::none_t{}); + if (config.IsNotNull() and not config->IsMap()) { + return unexpected{fmt::format("Unsupported value {} for key \"config\"", + config->ToString())}; + } + return FileRoot::ComputedRoot{.repository = *repo, + .target_module = target_module->String(), + .target_name = target_module->String(), + .config = config.IsNotNull() + ? config->ToJson() + : nlohmann::json::object()}; +} diff --git a/src/other_tools/utils/parse_computed_root.hpp b/src/other_tools/utils/parse_computed_root.hpp new file mode 100644 index 00000000..e23284da --- /dev/null +++ b/src/other_tools/utils/parse_computed_root.hpp @@ -0,0 +1,49 @@ +// Copyright 2024 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INCLUDED_SRC_OTHER_TOOLS_UTILS_PARSE_COMPUTED_ROOT_HPP +#define INCLUDED_SRC_OTHER_TOOLS_UTILS_PARSE_COMPUTED_ROOT_HPP + +#include <optional> +#include <string> + +#include "gsl/gsl" +#include "src/buildtool/build_engine/expression/expression_ptr.hpp" +#include "src/buildtool/file_system/file_root.hpp" +#include "src/utils/cpp/expected.hpp" + +class ComputedRootParser final { + public: + /// \brief Create a parser for computed roots + /// \param repository Repository to be parsed + /// \return Initialized parser on success, or std::nullopt if repository + /// isn't Map or type is not computed. + [[nodiscard]] static auto Create( + gsl::not_null<ExpressionPtr const*> const& repository) noexcept + -> std::optional<ComputedRootParser>; + + [[nodiscard]] auto GetTargetRepository() const + -> expected<std::string, std::string>; + + [[nodiscard]] auto GetResult() const + -> expected<FileRoot::ComputedRoot, std::string>; + + private: + ExpressionPtr const& repository_; + explicit ComputedRootParser( + gsl::not_null<ExpressionPtr const*> const& repository) + : repository_{*repository} {} +}; + +#endif // INCLUDED_SRC_OTHER_TOOLS_UTILS_PARSE_COMPUTED_ROOT_HPP |