diff options
author | Maksim Denisov <denisov.maksim@huawei.com> | 2024-12-19 11:35:25 +0100 |
---|---|---|
committer | Maksim Denisov <denisov.maksim@huawei.com> | 2024-12-20 11:36:17 +0100 |
commit | 5e2fe74d3e5798ef73b3eef98d84577d881aad9a (patch) | |
tree | 76e0531c07d63cc0a1a55c70d524f6ae8e8bf522 /src/other_tools/utils/parse_precomputed_root.cpp | |
parent | 1e9080be33a18dd672d2cb035a18ba1d1aba0fb6 (diff) | |
download | justbuild-5e2fe74d3e5798ef73b3eef98d84577d881aad9a.tar.gz |
TreeStructure: Unify parsing of precomputed roots in just-mr
Diffstat (limited to 'src/other_tools/utils/parse_precomputed_root.cpp')
-rw-r--r-- | src/other_tools/utils/parse_precomputed_root.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/other_tools/utils/parse_precomputed_root.cpp b/src/other_tools/utils/parse_precomputed_root.cpp new file mode 100644 index 00000000..0b176450 --- /dev/null +++ b/src/other_tools/utils/parse_precomputed_root.cpp @@ -0,0 +1,90 @@ +// 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_precomputed_root.hpp" + +#include <utility> + +#include "fmt/core.h" +#include "nlohmann/json.hpp" +#include "src/buildtool/build_engine/expression/expression.hpp" + +namespace { +[[nodiscard]] auto ParseComputedRoot(ExpressionPtr const& repository) + -> expected<ComputedRoot, 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\":\n{}", + repo->ToString())}; + } + + 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\":\n{}", 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\":\n{}", 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\":\n{}", config->ToString())}; + } + return ComputedRoot{.repository = repo->String(), + .target_module = target_module->String(), + .target_name = target_module->String(), + .config = config.IsNotNull() + ? config->ToJson() + : nlohmann::json::object()}; +} +} // namespace + +auto ParsePrecomputedRoot(ExpressionPtr const& repository) + -> expected<PrecomputedRoot, std::string> { + if (not repository.IsNotNull() or not repository->IsMap()) { + return unexpected<std::string>{"Repository has an incorrect format"}; + } + + auto const type = repository->Get("type", Expression::none_t()); + if (not type.IsNotNull()) { + return unexpected<std::string>{"Mandatory key \"type\" is missing"}; + } + if (not type->IsString()) { + return unexpected{fmt::format("Unsupported value for key \"type\":\n{}", + type->ToString())}; + } + + auto const& type_marker = type->String(); + if (type_marker == ComputedRoot::kMarker) { + auto computed = ParseComputedRoot(repository); + if (not computed) { + return unexpected{std::move(computed).error()}; + } + return PrecomputedRoot{*std::move(computed)}; + } + return unexpected{ + fmt::format("Unknown type {} of precomputed repository", type_marker)}; +} |