summaryrefslogtreecommitdiff
path: root/src/utils/levenshtein_distance.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-01-24 07:03:40 +0800
committer魏曹先生 <1992414357@qq.com>2026-01-24 07:03:40 +0800
commit3fa56b997b44caba630a5dbc67687923978c5c7d (patch)
treeb1f62fe31f88fb666e810637df8ca7a60265a3ee /src/utils/levenshtein_distance.rs
parent92f2cdd3dfa378cfcfb9085fedd601b27e499ee7 (diff)
Add command aliases, error handling improvements, and flag aliases
- Add aliases for status command: sign, sheet, sheet.add, drop, drop.cat - Improve error handling with detailed localized messages for prepare, execute, and render phases - Add flag aliases: -L for --lang and -R for --renderer - Implement similar command suggestions using Levenshtein distance - Fix command matching logic to avoid ambiguous prefix issues
Diffstat (limited to 'src/utils/levenshtein_distance.rs')
-rw-r--r--src/utils/levenshtein_distance.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/utils/levenshtein_distance.rs b/src/utils/levenshtein_distance.rs
new file mode 100644
index 0000000..6bdb7e7
--- /dev/null
+++ b/src/utils/levenshtein_distance.rs
@@ -0,0 +1,34 @@
+use std::cmp::min;
+
+pub fn levenshtein_distance(a: &str, b: &str) -> usize {
+ let a_chars: Vec<char> = a.chars().collect();
+ let b_chars: Vec<char> = b.chars().collect();
+ let a_len = a_chars.len();
+ let b_len = b_chars.len();
+
+ if a_len == 0 {
+ return b_len;
+ }
+ if b_len == 0 {
+ return a_len;
+ }
+
+ let mut dp = vec![vec![0; b_len + 1]; a_len + 1];
+
+ for (i, row) in dp.iter_mut().enumerate() {
+ row[0] = i;
+ }
+
+ for (j, cell) in dp[0].iter_mut().enumerate() {
+ *cell = j;
+ }
+
+ for (i, a_char) in a_chars.iter().enumerate() {
+ for (j, b_char) in b_chars.iter().enumerate() {
+ let cost = if a_char == b_char { 0 } else { 1 };
+ dp[i + 1][j + 1] = min(dp[i][j + 1] + 1, min(dp[i + 1][j] + 1, dp[i][j] + cost));
+ }
+ }
+
+ dp[a_len][b_len]
+}