use std::collections::{HashMap, HashSet};
use std::iter::FromIterator;
pub(in crate) const WEIGHTS: [u32; 17] = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];
lazy_static! {
pub(in crate) static ref VALUE_MAP: HashMap<char, u32> = vec![
('A', 1), ('B', 2), ('C', 3), ('D', 4), ('E', 5), ('F', 6),
('G', 7), ('H', 8), ('J', 1), ('K', 2), ('L', 3), ('M', 4),
('N', 5), ('P', 7), ('R', 9), ('S', 2), ('T', 3), ('U', 4),
('V', 5), ('W', 6), ('X', 7), ('Y', 8), ('Z', 9), ('1', 1),
('2', 2), ('3', 3), ('4', 4), ('5', 5), ('6', 6), ('7', 7),
('8', 8), ('9', 9), ('0', 0),
].into_iter().collect();
pub(in crate) static ref ALLOWED_CHARS: HashSet<char> = VALUE_MAP.keys().cloned().collect();
pub(in crate) static ref REGIONS: Vec<(HashSet<char>, String)> = vec![
(HashSet::from_iter("ABCDEFGH".chars().into_iter()), "Africa".to_string()),
(HashSet::from_iter("JKLMNPR".chars().into_iter()), "Asia".to_string()),
(HashSet::from_iter("STUVWXYZ".chars().into_iter()), "Europe".to_string()),
(HashSet::from_iter("12345".chars().into_iter()), "North America".to_string()),
(HashSet::from_iter("67".chars().into_iter()), "Oceania".to_string()),
(HashSet::from_iter("89".chars().into_iter()), "South America".to_string()),
];
pub(in crate) static ref COUNTRIES: HashMap<String, String> = unpack_countries(vec![
("A-AH", "South Africa"),
("A-JN", "Cote d'Ivoire"),
("B-AE", "Angola"),
("B-FK", "Kenya"),
("B-LR", "Tanzania"),
("C-AE", "Benin"),
("C-FK", "Madagascar"),
("C-LR", "Tunisia"),
("D-AE", "Egypt"),
("D-FK", "Morocco"),
("D-LR", "Zambia"),
("E-AE", "Ethiopia"),
("E-FK", "Mozambique"),
("F-AE", "Ghana"),
("F-FK", "Nigeria"),
("J-A0", "Japan"),
("K-AE", "Sri Lanka"),
("K-FK", "Israel"),
("K-LR", "Korea (South),"),
("K-S0", "Kazakhstan"),
("L-A0", "China (Mainland),"),
("M-AE", "India"),
("M-FK", "Indonesia"),
("M-LR", "Thailand"),
("M-S0", "Myanmar"),
("N-AE", "Iran"),
("N-FK", "Pakistan"),
("N-LR", "Turkey"),
("P-AE", "Philippines"),
("P-FK", "Singapore"),
("P-LR", "Malaysia"),
("R-AE", "United Arab Emirates"),
("R-FK", "Taiwan, China"),
("R-LR", "Vietnam"),
("R-S0", "Saudi Arabia"),
("S-AM", "United Kingdom"),
("S-NT", "Germany/East Germany"),
("S-UZ", "Poland"),
("S-14", "Latvia"),
("T-AH", "Switzerland"),
("T-JP", "Czech Republic"),
("T-RV", "Hungary"),
("T-W1", "Portugal"),
("U-HM", "Denmark"),
("U-NT", "Ireland"),
("U-UZ", "Romania"),
("U-57", "Slovakia"),
("V-AE", "Austria"),
("V-FR", "France"),
("V-SW", "Spain"),
("V-X2", "Serbia"),
("V-35", "Croatia"),
("V-60", "Estonia"),
("W-A0", "Germany/West Germany"),
("X-AE", "Bulgaria"),
("X-FK", "Greece"),
("X-LR", "Netherlands"),
("X-SW", "USSR/CIS"),
("X-X2", "Luxembourg"),
("X-30", "Russia"),
("Y-AE", "Belgium"),
("Y-FK", "Finland"),
("Y-LR", "Malta"),
("Y-SW", "Sweden"),
("Y-X2", "Norway"),
("Y-35", "Belarus"),
("Y-60", "Ukraine"),
("Z-AR", "Italy"),
("Z-X2", "Slovenia"),
("Z-35", "Lithuania"),
("1-A0", "United States"),
("2-A0", "Canada"),
("3-AW", "Mexico"),
("3-X7", "Costa Rica"),
("3-89", "Cayman Islands"),
("4-A0", "United States"),
("5-A0", "United States"),
("6-A0", "Australia"),
("7-A0", "New Zealand"),
("8-AE", "Argentina"),
("8-FK", "Chile"),
("8-LR", "Ecuador"),
("8-SW", "Peru"),
("8-X2", "Venezuela"),
("9-AE", "Brazil"),
("9-FK", "Colombia"),
("9-LR", "Paraguay"),
("9-SW", "Uruguay"),
("9-X2", "Trinidad & Tobago"),
("9-39", "Brazil"),
]);
pub(in crate) static ref MANS: HashMap<String, String> = vec![
("0VF", "Ford",),
("112", "Volkswagen",),
("115", "Mercedes-Benz",),
("117", "Volkswagen",),
("119", "Replica/Kit Makes",),
("123", "Mercedes-Benz",),
("124", "Chevrolet",),
("178", "Jaguar",),
("19", "Acura",),
("19X", "Honda",),
("1A8", "Chrysler",),
("1B", "Dodge",),
("1C", "Chrysler",),
("1D", "Dodge",),
("1F", "Ford",),
("1F9", "FWD Corp.",),
("1FU", "Freightliner",),
("1FV", "Freightliner",),
("1G", "General Motors",),
("1G1", "Chevrolet",),
("1G2", "Pontiac",),
("1G3", "Oldsmobile",),
("1G4", "Buick",),
("1G6", "Cadillac",),
("1G8", "Saturn",),
("1G9", "Google",),
("1GB", "Chevrolet USA",),
("1GC", "Chevrolet",),
("1GM", "Pontiac",),
("1GN", "Chevrolet USA",),
("1GT", "GMC Truck",),
("1GY", "Cadillac",),
("1H", "Honda",),
("1HD", "Harley-Davidson",),
("1J", "Jeep",),
("1L", "Lincoln",),
("1M", "Mercury",),
("1M1", "Mack Truck",),
("1M2", "Mack Truck",),
("1M3", "Mack Truck",),
("1M4", "Mack Truck",),
("1M9", "Mynatt Truck & Equipment",),
("1ME", "Mercury",),
("1N", "Nissan",),
("1NX", "NUMMI",),
("1P3", "Plymouth",),
("1R9", "Roadrunner Hay Squeeze",),
("1V1", "Volkswagen USA (Commercials)",),
("1VW", "Volkswagen",),
("1XK", "Kenworth",),
("1XP", "Peterbilt",),
("1YV", "Mazda",),
("1Z7", "Mitsubishi",),
("1ZV", "Auto Alliance International",),
("210", "Ford",),
("2A4", "Chrysler Canada",),
("2A8", "Chrysler Canada",),
("2B3", "Dodge Canada",),
("2B4", "Dodge",),
("2C3", "Chrysler",),
("2C4", "Chrysler Canada",),
("2C8", "Chrysler",),
("2CN", "CAMI",),
("2CT", "General Motors",),
("2D3", "Dodge",),
("2D4", "Dodge Canada",),
("2D8", "Dodge Canada",),
("2DG", "Ontario Drive & Gear",),
("2F", "Ford",),
("2FT", "Ford Motor Company",),
("2FU", "Freightliner",),
("2FV", "Freightliner",),
("2FZ", "Sterling",),
("2G", "General Motors",),
("2G1", "Chevrolet",),
("2G2", "Pontiac",),
("2G3", "Oldsmobile",),
("2G4", "Buick",),
("2G6", "Cadillac",),
("2G9", "Gnome Homes",),
("2GC", "Chevrolet Canada",),
("2GN", "Chevrolet Canada",),
("2H", "Honda",),
("2HH", "Acura",),
("2HM", "Hyundai",),
("2HN", "Acura",),
("2L", "Lincoln",),
("2M", "Mercury",),
("2NV", "Nova Bus",),
("2P3", "Plymouth",),
("2S2", "Suzuki",),
("2S3", "Suzuki Canada",),
("2T", "Toyota",),
("2T2", "Lexus Canada",),
("2V4", "Volkswagen",),
("2V8", "Volkswagen",),
("2W", "Western Star",),
("309", "Chevrolet",),
("3A", "Chrysler Mexico",),
("3B7", "Dodge Mexico",),
("3C", "Chrysler",),
("3C3", "Fiat",),
("3C4", "Dodge Mexico",),
("3CZ", "Honda Mexico",),
("3D", "Dodge",),
("3D4", "Dodge",),
("3F", "Ford",),
("3G", "General Motors",),
("3GC", "Chevrolet Mexico",),
("3GN", "Chevrolet Mexico",),
("3GY", "Cadillac",),
("3H", "Honda",),
("3KP", "Kia",),
("3LN", "Lincoln",),
("3MD", "Mazda",),
("3ME", "Mercury Mexico",),
("3MY", "Mazda Mexico",),
("3MZ", "Mazda Mexico",),
("3N", "Nissan",),
("3P3", "Plymouth Mexico",),
("3TM", "Toyota Mexico",),
("3VW", "Volkswagen",),
("460", "Mercedes-Benz",),
("4A", "Mitsubishi",),
("4A3", "Mitsubishi",),
("4A4", "Mitsubishi",),
("4F", "Mazda",),
("4GD", "Opel",),
("4J", "Mercedes-Benz",),
("4M", "Mercury",),
("4RK", "Nova Bus",),
("4S", "Subaru-Isuzu Automotive",),
("4S6", "Honda",),
("4T", "Toyota",),
("4US", "BMW",),
("4UZ", "Frt-Thomas Bus",),
("4V", "Volvo",),
("54D", "Chevrolet",),
("55", "Mercedes-Benz",),
("55S", "Mercedes-Benz",),
("58A", "Lexus",),
("5F", "Honda",),
("5FR", "Acura",),
("5GA", "Buick",),
("5GN", "Hummer",),
("5GR", "Hummer",),
("5GT", "Hummer",),
("5GZ", "Saturn",),
("5J6", "Honda",),
("5J8", "Acura",),
("5KB", "Honda",),
("5L", "Lincoln",),
("5N1", "Nissan",),
("5N3", "Nissan Infiniti",),
("5NM", "Hyundai",),
("5NP", "Hyundai",),
("5T", "Toyota",),
("5U", "BMW",),
("5X", "Hyundai/Kia",),
("5XX", "Kia",),
("5XY", "Kia",),
("5Y2", "Pontiac",),
("5YF", "Toyota",),
("5YJ", "Tesla",),
("5YM", "BMW",),
("601", "Replica/Kit Makes",),
("602", "Toyota",),
("6AB", "MAN",),
("6F", "Ford",),
("6F4", "Nissan Motor Company",),
("6F5", "Kenworth",),
("6FP", "Ford Motor Company",),
("6G", "General Motors",),
("6G1", "Chevrolet",),
("6G2", "Pontiac",),
("6G3", "Chevrolet Australia",),
("6H", "Holden",),
("6H8", "General Motors-Holden",),
("6MM", "Mitsubishi",),
("6T1", "Toyota",),
("7A3", "Honda",),
("8A1", "Renault",),
("8AC", "Mercedes Benz",),
("8AD", "Peugeot",),
("8AF", "Ford",),
("8AG", "General Motors",),
("8AJ", "Toyota",),
("8AK", "Suzuki",),
("8AP", "Fiat",),
("8AT", "Iveco",),
("8AW", "Volkswagen",),
("8BC", "Citroën",),
("8BR", "Mercedes-Benz Argentina",),
("8BT", "Mercedes-Benz Argentina",),
("8C3", "Honda",),
("8GD", "Peugeot",),
("8GG", "Chevrolet",),
("935", "Citroën",),
("936", "Peugeot",),
("93H", "Honda",),
("93R", "Toyota",),
("93U", "Audi",),
("93V", "Audi Brazil",),
("93W", "Fiat Professional",),
("93X", "Souza Ramos - Mitsubishi / Suzuki",),
("93Y", "Renault",),
("93Z", "Iveco",),
("94D", "Nissan",),
("953", "VW Trucks / MAN",),
("95P", "CAOA / Hyundai",),
("988", "Jeep",),
("98M", "BMW",),
("98R", "Chery",),
("99A", "Audi",),
("99J", "JLR Jaguar Land Rover",),
("9BD", "Fiat Automóveis",),
("9BF", "Ford",),
("9BG", "General Motors",),
("9BH", "Hyundai Motor Company / Hyundai",),
("9BM", "Mercedes Benz",),
("9BR", "Toyota",),
("9BS", "Scania",),
("9BV", "Volvo Trucks",),
("9BW", "Volkswagen",),
("9C2", "Honda Motorcycles",),
("9C6", "Yamaha",),
("9CD", "Suzuki Motorcycles",),
("9FB", "Renault",),
("9UJ", "Chery",),
("9UK", "Lifan",),
("9UW", "Kia",),
("AAV", "Volkswagen",),
("AFA", "Ford",),
("AHT", "Toyota",),
("B01", "Cadillac",),
("CF1", "Renault",),
("CL9", "Wallyscar",),
("EDB", "Mercedes-Benz",),
("FSM", "FSM",),
("FV1", "Renault",),
("FV3", "Peugeot",),
("FV7", "Citroen",),
("GA1", "Renault",),
("JA", "Isuzu",),
("JA3", "Mitsubishi",),
("JA4", "Mitsubishi",),
("JB3", "Dodge",),
("JC1", "Fiat Automobiles/Mazda",),
("JDA", "Daihatsu",),
("JF", "Fuji Heavy Industries",),
("JGN", "Chevrolet",),
("JH", "Honda",),
("JH4", "Acura",),
("JK", "Kawasaki",),
("JM", "Mazda",),
("JMB", "Mitsubishi",),
("JN", "Nissan",),
("JNK", "Nissan Infiniti",),
("JNR", "Nissan Infiniti",),
("JNT", "Nissan Infiniti",),
("JNX", "Nissan Infiniti",),
("JS", "Suzuki",),
("JT", "Toyota",),
("JTH", "Lexus",),
("JTJ", "Lexus",),
("JTK", "Scion",),
("JTL", "Scion",),
("JY", "Yamaha",),
("KL", "Daewoo/GM Korea",),
("KL1", "Chevrolet",),
("KL4", "Buick",),
("KL7", "Chevrolet",),
("KL8", "Chevrolet",),
("KM", "Hyundai",),
("KN", "Kia",),
("KNM", "Renault Samsung",),
("KP", "SsangYong",),
("KRX", "BMW",),
("L56", "Renault Samsung",),
("L5Y", "Merato Motorcycle Taizhou Zhongneng",),
("L6T", "Geely",),
("LBE", "Beijing Hyundai",),
("LBV", "BMW Brilliance",),
("LC0", "BYD Bus",),
("LDC", "Dongfeng Peugeot-Citroën",),
("LDY", "Zhongtong Coach",),
("LE4", "Beijing Benz",),
("LFM", "FAW Toyota",),
("LFP", "FAW Car",),
("LFV", "FAW-Volkswagen",),
("LGB", "Dongfeng Nissan",),
("LGH", "Dong Feng (DFM), China",),
("LGJ", "Dongfeng Fengshen",),
("LGW", "Great Wall (Havel)",),
("LGX", "BYD Auto",),
("LH1", "FAW Haima",),
("LHG", "Guangzhou Honda",),
("LJ1", "JAC",),
("LJD", "Dongfeng Yueda Kia",),
("LKL", "Suzhou King Long",),
("LLV", "Lifan",),
("LMG", "GAC Trumpchi",),
("LPA", "Changan PSA (DS Automobiles)",),
("LRB", "Buick China",),
("LS5", "Changan Suzuki",),
("LSG", "SAIC General Motors",),
("LSJ", "SAIC MG",),
("LSV", "SAIC Volkswagen",),
("LSY", "Brilliance Zhonghua",),
("LTV", "FAW Toyota (Tianjin)",),
("LUC", "Honda",),
("LVG", "GAC Toyota",),
("LVH", "Dongfeng Honda",),
("LVR", "Changan Mazda",),
("LVS", "Changan Ford",),
("LVV", "Chery",),
("LWV", "GAC Fiat",),
("LYV", "Volvo China",),
("LZE", "Isuzu Guangzhou",),
("LZG", "Shaanxi Automobile Group",),
("LZM", "MAN",),
("LZW", "SAIC GM Wuling",),
("LZY", "Yutong",),
("MA1", "Mahindra",),
("MA3", "Suzuki",),
("MA7", "Honda Siel Cars",),
("MAJ", "FordS",),
("MAL", "Hyundai",),
("MAT", "Tata",),
("MBH", "Nissan",),
("MC2", "Volvo Eicher commercial vehicles limited.",),
("MDH", "Nissan",),
("MHR", "Honda",),
("ML3", "Mitsubishi Thailand",),
("MM0", "Mazda",),
("MM8", "Mazda",),
("MMB", "Mitsubishi",),
("MMC", "Mitsubishi",),
("MMM", "Chevrolet",),
("MMS", "Suzuki",),
("MMT", "Mitsubishi",),
("MNB", "Ford",),
("MNT", "Nissan",),
("MP1", "Isuzu",),
("MPA", "Isuzu",),
("MR0", "Toyota",),
("MRH", "Honda",),
("MS0", "KIA Myanmar",),
("NLA", "Honda",),
("NLE", "Mercedes-Benz Turk Truck",),
("NLH", "Hyundai",),
("NLJ", "Hyundai",),
("NM0", "Ford Otosan",),
("NM4", "Tofas Turk",),
("NMT", "Toyota",),
("PE1", "Ford",),
("PE3", "Mazda",),
("PL1", "Proton",),
("SAD", "Jaguar",),
("SAH", "Honda",),
("SAJ", "Jaguar",),
("SAL", "Land Rover",),
("SAR", "Rover",),
("SAT", "Triumph",),
("SAX", "Rover",),
("SB1", "Toyota",),
("SBM", "Mclaren",),
("SCA", "Rolls Royce",),
("SCB", "Bentley",),
("SCC", "Lotus Cars",),
("SCE", "DeLorean",),
("SCF", "Aston Martin Lagonda Limited",),
("SDB", "Peugeot UK",),
("SED", "Opel",),
("SEY", "LDV",),
("SFA", "Ford",),
("SFD", "Alexander Dennis",),
("SHH", "Honda",),
("SHS", "Honda",),
("SJK", "Nissan Infiniti",),
("SJN", "Nissan",),
("SKF", "Opel",),
("SNE", "Jeep",),
("SNT", "Honda",),
("SU9", "Solaris Bus & Coach",),
("SUF", "Fiat Auto Poland / FSM",),
("SUL", "Daewoo Poland / FSO",),
("SUP", "Daewoo Poland / FSO",),
("SUR", "Land Rover",),
("TCC", "Micro Compact Car AG (SMART 1998-1999)",),
("TDM", "QUANTYA Swiss Electric Movement",),
("TK9", "SOR",),
("TM9", "Å koda trolleybuses",),
("TMA", "Hyundai",),
("TMB", "Å koda",),
("TMK", "Karosa",),
("TMP", "Å koda trolleybuses",),
("TMT", "Tatra",),
("TN9", "Karosa",),
("TNB", "Skoda",),
("TRA", "Ikarus Bus",),
("TRU", "Audi",),
("TSE", "Ikarus Egyedi Autobuszgyar",),
("TSM", "Suzuki",),
("TYB", "Mitsubishi",),
("U5Y", "Kia",),
("U6Y", "Kia",),
("USY", "Kia",),
("UU", "Dacia",),
("UU1", "Renault Dacia",),
("V0L", "Opel",),
("VA0", "ÖAF",),
("VF0", "Ford",),
("VF1", "Renault",),
("VF2", "Renault",),
("VF3", "Peugeot",),
("VF4", "Talbot",),
("VF5", "Iveco Unic SA",),
("VF6", "Renault Trucks/Volvo",),
("VF7", "Citroën",),
("VF8", "Matra/Talbot/Simca",),
("VF9", "Bugatti",),
("VFB", "Renault",),
("VFE", "IvecoBus",),
("VFF", "Peugeot",),
("VFG", "Citroen",),
("VFJ", "Renault",),
("VFZ", "Citroen",),
("VH8", "Microcar",),
("VLG", "Aixam",),
("VLU", "Scania",),
("VN1", "Opel",),
("VNE", "Irisbus",),
("VNK", "Toyota",),
("VNV", "Renault",),
("VS1", "Iveco",),
("VS3", "Peugeot",),
("VS5", "Renault",),
("VS6", "Ford",),
("VS7", "Citroen",),
("VS9", "Carrocerias Ayats",),
("VSA", "Mercedes-Benz",),
("VSE", "Suzuki / Santana Motors",),
("VSK", "Nissan",),
("VSS", "SEAT",),
("VSX", "Opel",),
("VSY", "Renault",),
("VSZ", "Seat",),
("VV9", "Tauro Sport Auto",),
("VW1", "Renault",),
("VW2", "Volkswagen",),
("VWA", "Nissan",),
("VWG", "Volkswagen Spain",),
("VWV", "Volkswagen",),
("VX1", "Zastava / Yugo",),
("W00", "Opel",),
("W04", "Buick",),
("W09", "Ruf Automobile",),
("W0L", "Opel/Vauxhall",),
("W0S", "Opel Special Vehicles",),
("W0V", "Opel",),
("WA1", "Audi",),
("WAG", "Neoplan",),
("WAP", "Alpina",),
("WAU", "Audi",),
("WAV", "Audi",),
("WAX", "SsangYong",),
("WB", "BMW",),
("WBD", "Mercedes-Benz",),
("WBS", "BMW M",),
("WCD", "Mercedes-Benz (Sprinter)",),
("WD3", "Daimler AG (Sprinter)",),
("WD4", "Daimler AG (Sprinter)",),
("WD8", "Mercedes-Benz",),
("WDA", "Daimler AG (Sprinter)",),
("WDB", "Mercedes-Benz",),
("WDC", "DaimlerChrysler AG/Daimler AG",),
("WDD", "DaimlerChrysler AG/Daimler AG",),
("WDF", "Mercedes-Benz",),
("WDP", "Mercedes-Benz (Sprinter)",),
("WDR", "Mercedes-Benz (Sprinter)",),
("WDY", "Mercedes-Benz (Sprinter)",),
("WDZ", "Mercedes-Benz (Sprinter)",),
("WE0", "Ford",),
("WEB", "EvoBus",),
("WF0", "Ford of Europe",),
("WF1", "Renault",),
("WF3", "Peugeot",),
("WF7", "Citroen",),
("WFD", "Fliegl",),
("WFO", "Ford",),
("WJM", "Iveco",),
("WJR", "Irmscher",),
("WKK", "Karl Kässbohrer Fahrzeugwerke",),
("WMA", "MAN",),
("WMB", "Audi",),
("WME", "Smart",),
("WMW", "Mini",),
("WMX", "DaimlerChrysler AG/Daimler AG",),
("WNK", "Toyota",),
("WOL", "Opel",),
("WP0", "Porsche car",),
("WP1", "Porsche SUV",),
("WS0", "Ford",),
("WSS", "Seat",),
("WUA", "Quattro",),
("WUW", "Volkswagen",),
("WV", "Volkswagen",),
("WV0", "Ford",),
("WV1", "Volkswagen Commercial Vehicles",),
("WV2", "Volkswagen Commercial Vehicles",),
("WV3", "Volkswagen Trucks",),
("WVZ", "Volkswagen",),
("WWD", "Mercedes-Benz",),
("WWW", "Volkswagen",),
("WYG", "Volkswagen",),
("WYW", "Volkswagen",),
("WZW", "Volkswagen",),
("X7L", "Renault",),
("X96", "Mercedes-Benz",),
("XL9", "Spyker",),
("XLB", "Volvo",),
("XLR", "DAF Trucks",),
("XMC", "Mitsubishi (NedCar)",),
("XNC", "Mitsubishi",),
("XTA", "AvtoVAZ",),
("XUF", "Opel",),
("XWF", "Opel",),
("Y6D", "Opel",),
("YAR", "Toyota",),
("YCM", "Mazda",),
("YH4", "Fisker",),
("YK1", "Saab",),
("YMB", "Skoda",),
("YS2", "Scania, Södertälje",),
("YS3", "Saab",),
("YS4", "Scania, Katrineholm",),
("YTN", "Saab NEVS",),
("YV1", "Volvo Cars",),
("YV2", "Volvo Trucks",),
("YV3", "Volvo Buses",),
("YV4", "Volvo Cars",),
("Z12", "Opel",),
("Z3B", "Chevrolet",),
("ZA9", "Bugatti",),
("ZAC", "FCA",),
("ZAF", "Fiat",),
("ZAM", "Maserati",),
("ZAP", "Piaggio/Vespa/Gilera",),
("ZAR", "Alfa Romeo",),
("ZCF", "Iveco",),
("ZCG", "Cagiva SpA",),
("ZD4", "Aprilia",),
("ZDF", "Ferrari Dino",),
("ZDM", "Ducati Motor Holdings SpA",),
("ZFA", "Fiat Automobiles",),
("ZFB", "Fiat",),
("ZFC", "Fiat V.I.",),
("ZFF", "Ferrari",),
("ZGA", "IvecoBus",),
("ZHW", "Lamborghini",),
("ZLA", "Lancia",),
("ZOM", "OM",),
("ZSA", "Fiat",),
].into_iter().map(|(x, y)| (x.to_string(), y.to_string()) ).collect();
}
fn unpack_countries(countries: Vec<(&str, &str)>) -> HashMap<String, String> {
const SEQ: &str = "ABCDEFGHJKLMNPRSTUVWXYZ1234567890";
let mut result: HashMap<String, String> = HashMap::new();
for (code, title) in countries {
let first = code.chars().nth(0).unwrap();
let from = code.chars().nth(2).unwrap();
let to = code.chars().nth(3).unwrap();
let all_chars = &SEQ[SEQ.find(from).unwrap()..SEQ.find(to).unwrap() + 1usize];
for ch in all_chars.chars() {
let mut key = first.to_string();
key.push(ch);
result.insert(key, title.to_string());
}
}
result
}
pub(in crate) fn get_region(r_code: &str) -> String {
let r_code = r_code.chars().nth(0).unwrap();
for (codes, region) in REGIONS.iter() {
if codes.contains(&r_code) {
return region.clone();
}
}
String::from("Unknown")
}
pub(in crate) fn get_country(c_code: &str) -> String {
COUNTRIES.get(c_code).unwrap().to_string()
}
pub(in crate) fn get_manufacturer(m_code: &str) -> String {
let result: Option<String> = MANS.get(m_code).or(MANS.get(&m_code[..2])).map(|x| x.clone());
result.unwrap_or("Unknown".to_string())
}