I think it'd be better to use text difference if a substring isn't found. I realised afterwards that I think this is how Scryfall does it anyway.
45 lines
1.2 KiB
Rust
45 lines
1.2 KiB
Rust
use clap::Parser;
|
|
use scryfall_deser::get_all_lowercase_card_names;
|
|
use scryfall_deser::get_local_cache_folder;
|
|
use scryfall_deser::init_db;
|
|
use scryfall_deser::update_db_with_file;
|
|
use textdistance::str::damerau_levenshtein;
|
|
|
|
#[derive(Parser, Debug)]
|
|
#[command(version, about, long_about = None)]
|
|
struct Args {
|
|
#[arg(short, long)]
|
|
update: bool,
|
|
remainder: Vec<String>,
|
|
}
|
|
|
|
fn main() {
|
|
let args = Args::parse();
|
|
if args.update {
|
|
init_db();
|
|
let mut path = get_local_cache_folder();
|
|
// TODO - actually download and update
|
|
path.push("oracle-cards-20250814210711.json");
|
|
update_db_with_file(path);
|
|
return;
|
|
}
|
|
let card_name = args.remainder;
|
|
if card_name.is_empty() {
|
|
panic!("You need to put some card text to search");
|
|
}
|
|
let search_string = card_name.join(" ");
|
|
//dbg!(&search_string);
|
|
let cards = get_all_lowercase_card_names();
|
|
//dbg!(&cards);
|
|
let mut matching_cards = Vec::new();
|
|
for card in cards {
|
|
if card.contains(&search_string) {
|
|
matching_cards.push(card.clone());
|
|
}
|
|
}
|
|
if matching_cards.is_empty() {
|
|
// Do some distance checking stuff
|
|
}
|
|
//dbg!(matching_cards);
|
|
}
|