Skip to content

Commit

Permalink
Fix formating
Browse files Browse the repository at this point in the history
  • Loading branch information
rjanalik committed Feb 18, 2025
1 parent 269d208 commit 2e49f41
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 36 deletions.
94 changes: 59 additions & 35 deletions src/util/completion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@ namespace util {

namespace completion {

//void normalize_bash_function_name(std::string &str) {
// std::replace(str.begin(), str.end(), '-', '_');
//}
// void normalize_bash_function_name(std::string &str) {
// std::replace(str.begin(), str.end(), '-', '_');
// }

std::string get_prefix(CLI::App *cli) {
std::string get_prefix(CLI::App* cli) {
if (cli == nullptr)
return "";

CLI::App *parent = cli->get_parent();
CLI::App* parent = cli->get_parent();
return get_prefix(parent) + "_" + cli->get_name();
}

void create_completion_rec(CLI::App *cli) {
void create_completion_rec(CLI::App* cli) {
std::string func_name = get_prefix(cli);
auto options = cli->get_options();
auto subcommands = cli->get_subcommands({});
Expand All @@ -28,45 +28,68 @@ void create_completion_rec(CLI::App *cli) {
options_positional.reserve(options.size());
std::vector<CLI::Option*> options_non_positional;
options_non_positional.reserve(options.size());
auto is_positional = [](CLI::Option* option) {return option->get_positional();};
auto is_non_positional = [](CLI::Option* option) {return option->nonpositional();};
std::copy_if(options.begin(), options.end(), std::back_inserter(options_positional), is_positional);
std::copy_if(options.begin(), options.end(), std::back_inserter(options_non_positional), is_non_positional);
auto is_positional = [](CLI::Option* option) {
return option->get_positional();
};
auto is_non_positional = [](CLI::Option* option) {
return option->nonpositional();
};
std::copy_if(options.begin(), options.end(),
std::back_inserter(options_positional), is_positional);
std::copy_if(options.begin(), options.end(),
std::back_inserter(options_non_positional), is_non_positional);

std::vector<std::string> options_non_positional_str;
options_non_positional_str.reserve(options_non_positional.size());
auto get_option_name = [](CLI::Option* option) {return option->get_name();};
std::transform(options_non_positional.begin(), options_non_positional.end(), std::back_inserter(options_non_positional_str), get_option_name);
auto get_option_name = [](CLI::Option* option) {
return option->get_name();
};
std::transform(options_non_positional.begin(), options_non_positional.end(),
std::back_inserter(options_non_positional_str),
get_option_name);

std::vector<std::string> subcommands_str;
subcommands_str.reserve(options.size());
auto get_subcommand_name = [](CLI::App* subcommand) {return subcommand->get_name();};
std::transform(subcommands.begin(), subcommands.end(), std::back_inserter(subcommands_str), get_subcommand_name);
auto get_subcommand_name = [](CLI::App* subcommand) {
return subcommand->get_name();
};
std::transform(subcommands.begin(), subcommands.end(),
std::back_inserter(subcommands_str), get_subcommand_name);

std::vector<std::string> complete_str;
complete_str.reserve(options_non_positional_str.size() + subcommands_str.size());
complete_str.insert(complete_str.end(), options_non_positional_str.begin(), options_non_positional_str.end());
complete_str.insert(complete_str.end(), subcommands_str.begin(), subcommands_str.end());

//TODO generic for all special args
//TODO optimize the functions (reuse if possible)
auto has_name = [](CLI::Option* option, std::string name) {return option->get_name() == name;};
auto has_uenv = [has_name](CLI::Option* option) {return has_name(option, "uenv");};
bool special_uenv = std::any_of(options_positional.begin(), options_positional.end(), has_uenv);

//TODO convert to functional
complete_str.reserve(options_non_positional_str.size() +
subcommands_str.size());
complete_str.insert(complete_str.end(), options_non_positional_str.begin(),
options_non_positional_str.end());
complete_str.insert(complete_str.end(), subcommands_str.begin(),
subcommands_str.end());

// TODO generic for all special args
// TODO optimize the functions (reuse if possible)
auto has_name = [](CLI::Option* option, std::string name) {
return option->get_name() == name;
};
auto has_uenv = [has_name](CLI::Option* option) {
return has_name(option, "uenv");
};
bool special_uenv = std::any_of(options_positional.begin(),
options_positional.end(), has_uenv);

// TODO convert to functional
std::string completions = "";
for (auto s: complete_str)
for (auto s : complete_str)
completions += s + " ";
//std::string completions = std::accumulate(complete_str.begin(), complete_str.end(), "", [](std::string X, std::string Y) {return X + Y + " ";});

// std::string completions = std::accumulate(complete_str.begin(),
// complete_str.end(), "", [](std::string X, std::string Y) {return X + Y +
// " ";});

fmt::print(R"({func_name}()
{{
UENV_OPTS="{completions}"
)", fmt::arg("func_name", func_name),
fmt::arg("completions", completions));
//TODO generic for all special args
)",
fmt::arg("func_name", func_name),
fmt::arg("completions", completions));
// TODO generic for all special args
if (special_uenv) {
std::string special_func_name = "_uenv_special_uenv";
std::string special_opts_name = "UENV_SPECIAL_OPTS_UENV";
Expand All @@ -77,16 +100,17 @@ void create_completion_rec(CLI::App *cli) {
{special_func_name}
UENV_OPTS+=" ${{{special_opts_name}}}"
fi
)", fmt::arg("special_func_name", special_func_name),
fmt::arg("special_opts_name", special_opts_name));
)",
fmt::arg("special_func_name", special_func_name),
fmt::arg("special_opts_name", special_opts_name));
}
fmt::print("}}\n\n");

for(auto *subcom : subcommands)
for (auto* subcom : subcommands)
create_completion_rec(subcom);
}

void create_completion(CLI::App *cli) {
void create_completion(CLI::App* cli) {
create_completion_rec(cli);

fmt::print(R"(
Expand Down
2 changes: 1 addition & 1 deletion src/util/completion.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace util {
namespace completion {

void create_completion(CLI::App *cli);
void create_completion(CLI::App* cli);

} // namespace completion
} // namespace util

0 comments on commit 2e49f41

Please sign in to comment.