blob: ba9a5278f344e11964bcca2fa867430ce11f16d8 [file] [log] [blame]
/*
* Copyright (C) 2023 The Android Open Source Project
*
* 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 "host/commands/cvd/acloud/create_converter_parser.h"
#include <vector>
#include <android-base/logging.h>
#include <android-base/parseint.h>
#include "common/libs/utils/flag_parser.h"
#include "host/commands/cvd/acloud/converter_parser_common.h"
namespace cuttlefish {
namespace acloud_impl {
static Flag LocalInstanceFlag(bool& local_instance_set,
std::optional<int>& local_instance) {
auto local_instance_flag = Flag();
local_instance_flag.Alias(
{FlagAliasMode::kFlagConsumesArbitrary, "--local-instance"});
local_instance_flag.Setter([&local_instance_set, &local_instance](
const FlagMatch& m) -> Result<void> {
local_instance_set = true;
if (m.value != "" && local_instance) {
return CF_ERRF(
"Instance number already set, was \"{}\", now set to \"{}\"",
*local_instance, m.value);
} else if (m.value != "" && !local_instance) {
int value = -1;
CF_EXPECTF(android::base::ParseInt(m.value, &value),
"Failed to parse \"{}\"", m.value);
local_instance = value;
}
return {};
});
return local_instance_flag;
}
static Flag VerboseFlag(bool& verbose) {
auto verbose_flag = Flag()
.Alias({FlagAliasMode::kFlagExact, "-v"})
.Alias({FlagAliasMode::kFlagExact, "-vv"})
.Alias({FlagAliasMode::kFlagExact, "--verbose"})
.Setter([&verbose](const FlagMatch&) -> Result<void> {
verbose = true;
return {};
});
return verbose_flag;
}
static Flag LocalImageFlag(bool& local_image_given,
std::optional<std::string>& local_image_path) {
return Flag()
.Alias({FlagAliasMode::kFlagConsumesArbitrary, "--local-image"})
.Setter([&local_image_given,
&local_image_path](const FlagMatch& m) -> Result<void> {
local_image_given = true;
if (m.value != "") {
local_image_path = m.value;
}
return {};
});
}
Result<ConverterParsed> ParseAcloudCreateFlags(cvd_common::Args& arguments) {
std::vector<Flag> flags;
bool local_instance_set = false;
std::optional<int> local_instance;
flags.emplace_back(LocalInstanceFlag(local_instance_set, local_instance));
std::optional<std::string> flavor;
flags.emplace_back(CF_EXPECT(AcloudCompatFlag({"config", "flavor"}, flavor)));
std::optional<std::string> local_kernel_image;
flags.emplace_back(CF_EXPECT(AcloudCompatFlag(
{"local-kernel-image", "local-boot-image"}, local_kernel_image)));
std::optional<std::string> image_download_dir;
flags.emplace_back(
CF_EXPECT(AcloudCompatFlag({"image-download-dir"}, image_download_dir)));
std::optional<std::string> local_system_image;
flags.emplace_back(
CF_EXPECT(AcloudCompatFlag({"local-system-image"}, local_system_image)));
bool verbose = false;
flags.emplace_back(VerboseFlag(verbose));
std::optional<std::string> branch;
flags.emplace_back(CF_EXPECT(AcloudCompatFlag({"branch"}, branch)));
bool local_image_given = false;
std::optional<std::string> local_image_path;
flags.emplace_back(LocalImageFlag(local_image_given, local_image_path));
std::optional<std::string> build_id;
flags.emplace_back(
CF_EXPECT(AcloudCompatFlag({"build-id", "build_id"}, build_id)));
std::optional<std::string> build_target;
flags.emplace_back(CF_EXPECT(
AcloudCompatFlag({"build-target", "build_target"}, build_target)));
std::optional<std::string> config_file;
flags.emplace_back(
CF_EXPECT(AcloudCompatFlag({"config-file", "config_file"}, config_file)));
std::optional<std::string> bootloader_build_id;
flags.emplace_back(CF_EXPECT(AcloudCompatFlag(
{"bootloader-build-id", "bootloader_build_id"}, bootloader_build_id)));
std::optional<std::string> bootloader_build_target;
flags.emplace_back(CF_EXPECT(
AcloudCompatFlag({"bootloader-build-target", "bootloader_build_target"},
bootloader_build_target)));
std::optional<std::string> bootloader_branch;
flags.emplace_back(CF_EXPECT(AcloudCompatFlag(
{"bootloader-branch", "bootloader_branch"}, bootloader_build_target)));
CF_EXPECT(ParseFlags(flags, arguments));
return ConverterParsed{
.local_instance = {.is_set = local_instance_set, .id = local_instance},
.flavor = flavor,
.local_kernel_image = local_kernel_image,
.image_download_dir = image_download_dir,
.local_system_image = local_system_image,
.verbose = verbose,
.branch = branch,
.local_image = {.given = local_image_given, .path = local_image_path},
.build_id = build_id,
.build_target = build_target,
.config_file = config_file,
.bootloader =
{
.build_id = bootloader_build_id,
.build_target = bootloader_build_target,
.branch = bootloader_branch,
},
};
}
} // namespace acloud_impl
} // namespace cuttlefish