1
0
mirror of https://github.com/CLIUtils/CLI11.git synced 2025-04-30 04:33:53 +00:00

style: pre-commit.ci fixes

This commit is contained in:
pre-commit-ci[bot] 2025-04-21 16:07:10 +00:00
parent 0549f7c450
commit 3021257c04

View File

@ -8,26 +8,28 @@
#include <CLI/CLI.hpp> #include <CLI/CLI.hpp>
#include <iostream> #include <iostream>
#include <limits>
#include <string> #include <string>
#include <vector> #include <vector>
#include <limits>
// Levenshtein distance function code generated by chatgpt // Levenshtein distance function code generated by chatgpt
int levenshteinDistance(const std::string& s1, const std::string& s2) { int levenshteinDistance(const std::string &s1, const std::string &s2) {
size_t len1 = s1.size(), len2 = s2.size(); size_t len1 = s1.size(), len2 = s2.size();
std::vector<std::vector<int>> dp(len1 + 1, std::vector<int>(len2 + 1)); std::vector<std::vector<int>> dp(len1 + 1, std::vector<int>(len2 + 1));
for (size_t i = 0; i <= len1; ++i) dp[i][0] = i; for(size_t i = 0; i <= len1; ++i)
for (size_t j = 0; j <= len2; ++j) dp[0][j] = j; dp[i][0] = i;
for(size_t j = 0; j <= len2; ++j)
dp[0][j] = j;
for (size_t i = 1; i <= len1; ++i) { for(size_t i = 1; i <= len1; ++i) {
for (size_t j = 1; j <= len2; ++j) { for(size_t j = 1; j <= len2; ++j) {
int cost = (s1[i - 1] == s2[j - 1]) ? 0 : 1; int cost = (s1[i - 1] == s2[j - 1]) ? 0 : 1;
dp[i][j] = std::min({ dp[i][j] = std::min({
dp[i - 1][j] + 1, // deletion dp[i - 1][j] + 1, // deletion
dp[i][j - 1] + 1, // insertion dp[i][j - 1] + 1, // insertion
dp[i - 1][j - 1] + cost // substitution dp[i - 1][j - 1] + cost // substitution
}); });
} }
} }
@ -35,19 +37,19 @@ int levenshteinDistance(const std::string& s1, const std::string& s2) {
} }
// Finds the closest string from a list // Finds the closest string from a list
std::pair<std::string,int> findClosestMatch(const std::string& input, const std::vector<std::string>& candidates) { std::pair<std::string, int> findClosestMatch(const std::string &input, const std::vector<std::string> &candidates) {
std::string closest; std::string closest;
int minDistance = std::numeric_limits<int>::max(); int minDistance = std::numeric_limits<int>::max();
for (const auto& candidate : candidates) { for(const auto &candidate : candidates) {
int distance = levenshteinDistance(input, candidate); int distance = levenshteinDistance(input, candidate);
if (distance < minDistance) { if(distance < minDistance) {
minDistance = distance; minDistance = distance;
closest = candidate; closest = candidate;
} }
} }
return { closest,minDistance }; return {closest, minDistance};
} }
/** This example demonstrates the use of `prefix_command` on a subcommand /** This example demonstrates the use of `prefix_command` on a subcommand
@ -62,46 +64,36 @@ int main(int argc, const char *argv[]) {
app.add_option("-v", value, "value"); app.add_option("-v", value, "value");
app.add_subcommand("install", ""); app.add_subcommand("install", "");
app.add_subcommand("upgrade",""); app.add_subcommand("upgrade", "");
app.add_subcommand("remove",""); app.add_subcommand("remove", "");
app.add_subcommand("test",""); app.add_subcommand("test", "");
app.allow_extras(true); app.allow_extras(true);
app.parse_complete_callback([&app]() { app.parse_complete_callback([&app]() {
auto extras = app.remaining(); auto extras = app.remaining();
if (extras.empty()) if(extras.empty()) {
{
return; return;
} }
auto subs = app.get_subcommands(nullptr); auto subs = app.get_subcommands(nullptr);
std::vector<std::string> list; std::vector<std::string> list;
for (const auto* sub : subs) { for(const auto *sub : subs) {
if (!sub->get_name().empty()) if(!sub->get_name().empty()) {
{
list.push_back(sub->get_name()); list.push_back(sub->get_name());
} }
auto aliases = sub->get_aliases(); auto aliases = sub->get_aliases();
if (!aliases.empty()) if(!aliases.empty()) {
{
list.insert(list.end(), aliases.begin(), aliases.end()); list.insert(list.end(), aliases.begin(), aliases.end());
} }
} }
for (auto& extra : extras) for(auto &extra : extras) {
{ if(extra.front() != '-') {
if (extra.front() != '-') auto closest = findClosestMatch(extra, list);
{ if(closest.second <= 3) {
auto closest = findClosestMatch(extra,list); std::cout << "unmatched commands " << extra << ", closest match is " << closest.first << "\n";
if (closest.second <= 3)
{
std::cout<<"unmatched commands "<<extra<<", closest match is "<<closest.first<<"\n";
} }
} }
} }
});
}
);
CLI11_PARSE(app, argc, argv); CLI11_PARSE(app, argc, argv);
return 0; return 0;
} }