92 lines
2.7 KiB
Rust
92 lines
2.7 KiB
Rust
use clap::Parser;
|
|
use scryfall_deser::find_matching_cards;
|
|
use scryfall_deser::get_all_lowercase_card_names;
|
|
use scryfall_deser::get_card_by_name;
|
|
use scryfall_deser::get_local_cache_folder;
|
|
use scryfall_deser::init_db;
|
|
use scryfall_deser::update_db_with_file;
|
|
use scryfall_deser::GetNameType;
|
|
use textdistance::str::damerau_levenshtein;
|
|
|
|
#[derive(Parser, Debug)]
|
|
#[command(version, about, long_about = None)]
|
|
struct Args {
|
|
/// Download the latest bulk from Scryfall and update local db
|
|
#[arg(short, long)]
|
|
update: bool,
|
|
/// Search for the exact string
|
|
#[arg(short, long)]
|
|
exact: bool,
|
|
/// Text to search for card with
|
|
search_text: Vec<String>,
|
|
}
|
|
|
|
fn exact_search(search_strings: Vec<String>) {
|
|
let search_string = search_strings.join(" ");
|
|
let card = get_card_by_name(&search_string, GetNameType::Name);
|
|
if card.is_none() {
|
|
panic!("No card found with exact name of {}", search_string);
|
|
}
|
|
println!("{}", card.unwrap());
|
|
}
|
|
|
|
fn main() {
|
|
let args = Args::parse();
|
|
if args.update {
|
|
init_db();
|
|
let mut path = get_local_cache_folder();
|
|
// TODO - actually download the file - probably do away with TempFile stuff
|
|
path.push("oracle-cards-20250814210711.json");
|
|
update_db_with_file(path);
|
|
return;
|
|
}
|
|
if args.search_text.is_empty() {
|
|
panic!("You need to put some card text to search");
|
|
}
|
|
|
|
if args.exact {
|
|
exact_search(args.search_text);
|
|
return;
|
|
}
|
|
|
|
let mut search_string = String::new();
|
|
for card in args.search_text {
|
|
search_string.push_str(&card.to_lowercase());
|
|
search_string.push_str(" ");
|
|
}
|
|
search_string.pop();
|
|
|
|
let matching_cards = find_matching_cards(&search_string);
|
|
dbg!(&matching_cards);
|
|
|
|
if matching_cards.is_empty() {
|
|
// Do some distance checking stuff
|
|
} else if matching_cards.len() == 1 {
|
|
let card = get_card_by_name(&matching_cards[0].name, GetNameType::LowercaseName);
|
|
dbg!(card);
|
|
} else {
|
|
for card in matching_cards {
|
|
println!(
|
|
"{}",
|
|
get_card_by_name(&card.lowercase_name, GetNameType::LowercaseName)
|
|
.unwrap()
|
|
.name
|
|
);
|
|
}
|
|
// This will be the harder part I think
|
|
}
|
|
|
|
/* For testing - all seemed to work alright
|
|
let card = get_card_by_name("Black Lotus", GetNameType::Name);
|
|
dbg!(card);
|
|
let cards = get_all_card_names();
|
|
for card in cards {
|
|
let card = get_card_by_name(&card);
|
|
dbg!(&card);
|
|
if card.is_none() {
|
|
panic!("None card for {:?}", card);
|
|
}
|
|
}
|
|
*/
|
|
}
|