diff options
| author | gingerBill <bill@gingerbill.org> | 2020-06-10 12:59:54 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-06-10 12:59:54 +0100 |
| commit | b8d33165c9436fc36e43f6b22c859d9a043eb986 (patch) | |
| tree | 2ad400e05b7510f431f8763fb7743f65dea2ecec /src/main.cpp | |
| parent | 6b3ee447f0e6783c414354088a41ad2f4926a45e (diff) | |
Add `-target:<string>` fuzzy checking with "Did you mean" message
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp index ea370a03f..d1c549b0f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -992,7 +992,33 @@ bool parse_build_flags(Array<String> args) { } if (!found) { + struct DistanceAndTarget { + isize distance; + isize target_index; + }; + DistanceAndTarget distances[gb_count_of(named_targets)] = {}; + for (isize i = 0; i < gb_count_of(named_targets); i++) { + distances[i].target_index = i; + distances[i].distance = levenstein_distance_case_insensitive(str, named_targets[i].name); + } + gb_sort_array(distances, gb_count_of(distances), gb_isize_cmp(gb_offset_of(DistanceAndTarget, distance))); + gb_printf_err("Unknown target '%.*s'\n", LIT(str)); + + enum {MAX_SMALLEST_DISTANCE = 3}; + if (distances[0].distance <= MAX_SMALLEST_DISTANCE) { + gb_printf_err("Did you mean:\n"); + for (isize i = 0; i < gb_count_of(named_targets); i++) { + if (distances[i].distance > MAX_SMALLEST_DISTANCE) { + break; + } + gb_printf_err("\t%.*s\n", LIT(named_targets[distances[i].target_index].name)); + } + } + gb_printf_err("All supported targets:\n"); + for (isize i = 0; i < gb_count_of(named_targets); i++) { + gb_printf_err("\t%.*s\n", LIT(named_targets[i].name)); + } bad_flags = true; } |