2023-01-26 15:04:39 +01:00
#![ feature(option_result_contains) ]
2023-01-27 00:03:00 +01:00
use std ::{ collections ::HashMap , time ::Instant } ;
2022-11-11 15:00:07 +01:00
2023-01-26 23:07:16 +01:00
use data ::CardInfo ;
use filter ::SearchCard ;
mod data ;
mod filter ;
mod parser ;
2023-01-26 15:04:39 +01:00
2022-11-11 15:00:07 +01:00
fn main ( ) -> Result < ( ) , Box < dyn std ::error ::Error > > {
2023-01-26 15:04:39 +01:00
let cards = serde_json ::from_reader ::< _ , CardInfo > ( std ::io ::BufReader ::new ( std ::fs ::File ::open ( " cards.json " ) ? ) ) ? . data ;
2023-01-26 15:04:39 +01:00
let search_cards : Vec < _ > = cards . iter ( ) . map ( SearchCard ::from ) . collect ( ) ;
let cards_by_id : HashMap < _ , _ > = cards . into_iter ( ) . map ( | c | ( c . id , c ) ) . collect ( ) ;
2023-01-27 00:03:00 +01:00
let now = Instant ::now ( ) ;
2023-01-26 18:12:37 +01:00
let raw_query = std ::env ::args ( ) . nth ( 1 ) . unwrap ( ) ;
2023-01-26 23:07:16 +01:00
let query = parser ::parse_filters ( & raw_query ) ? ;
2023-01-27 00:03:00 +01:00
let query_time = now . elapsed ( ) ;
let now = Instant ::now ( ) ;
let matches : Vec < _ > = search_cards . iter ( ) . filter ( | card | query . iter ( ) . all ( | q | q ( card ) ) ) . collect ( ) ;
let filter_time = now . elapsed ( ) ;
for c in & matches {
println! ( " {} \n " , cards_by_id . get ( & c . id ) . unwrap ( ) ) ;
2023-01-26 15:04:39 +01:00
}
2023-01-27 00:03:00 +01:00
println! ( " Parsed query in {:?} " , query_time ) ;
println! ( " Searched {} cards in {:?} ( {} hits) " , search_cards . len ( ) , filter_time , matches . len ( ) ) ;
2023-01-26 23:07:16 +01:00
Ok ( ( ) )
2022-10-05 17:57:01 +02:00
}