String closeness seems alright

Might be worth sorting by relevance
This commit is contained in:
2025-08-20 23:23:35 +01:00
parent 3c78637809
commit 3e1b89312a
3 changed files with 69 additions and 45 deletions

View File

@@ -1,5 +1,6 @@
use clap::Parser;
use scryfall_deser::find_matching_cards_scryfall_style;
use scryfall_deser::get_all_mtg_words;
use scryfall_deser::get_card_by_name;
use scryfall_deser::get_local_cache_folder;
use scryfall_deser::init_db;
@@ -15,15 +16,16 @@ impl Termination for MtgCardExit {
MtgCardExit::Success => ExitCode::SUCCESS,
MtgCardExit::EmptySearchString => ExitCode::from(101),
MtgCardExit::NoExactMatchCard => ExitCode::from(102),
MtgCardExit::DidYouMean => ExitCode::from(105),
}
}
}
enum MtgCardExit {
// No error... unsure it should be in this enum
Success,
EmptySearchString,
NoExactMatchCard,
DidYouMean,
}
#[derive(Parser, Debug)]
@@ -88,14 +90,26 @@ fn main() -> MtgCardExit {
let matching_cards = find_matching_cards_scryfall_style(&args.search_text);
if matching_cards.is_empty() {
// Do some distance checking stuff
let mtg_words = get_all_mtg_words();
let mut close_names = Vec::new();
for search_string in args.search_text {
for mtg_card_name in &mtg_words {
let dist = damerau_levenshtein(&search_string, &mtg_card_name);
if dist <= 2 {
close_names.push(mtg_card_name);
}
}
}
for card in close_names {
println!("{}", card);
}
return MtgCardExit::DidYouMean;
} else if matching_cards.len() == 1 {
let card = get_card_by_name(&matching_cards[0].name, GetNameType::LowercaseName).unwrap();
println!("{}", card);
return MtgCardExit::Success;
} else {
for card in matching_cards {
dbg!(&card);
println!(
"{}",
get_card_by_name(&card.lowercase_name, GetNameType::LowercaseName)
@@ -105,5 +119,4 @@ fn main() -> MtgCardExit {
}
return MtgCardExit::Success;
}
unreachable!("Don't know how you got here - there's a real bug with this");
}