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, } fn exact_search(search_strings: Vec) { 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); } } */ }