From c51d2b700aee76c7491bd5acb2a4c351f7fe1e37 Mon Sep 17 00:00:00 2001 From: G2-Games Date: Sun, 17 Dec 2023 02:27:25 -0600 Subject: [PATCH] Fixed a lot of `clippy` warnings --- minidisc-rs/Cargo.toml | 1 + minidisc-rs/src/netmd/base.rs | 14 +- minidisc-rs/src/netmd/interface.rs | 106 ++- minidisc-rs/src/netmd/mappings.rs | 1102 +++++++++++++------------- minidisc-rs/src/netmd/query_utils.rs | 35 +- minidisc-rs/src/netmd/utils.rs | 38 +- 6 files changed, 640 insertions(+), 656 deletions(-) diff --git a/minidisc-rs/Cargo.toml b/minidisc-rs/Cargo.toml index 377b35b..0cb4ddc 100644 --- a/minidisc-rs/Cargo.toml +++ b/minidisc-rs/Cargo.toml @@ -23,6 +23,7 @@ des = "0.8.1" webusb = "0.5.0" unicode-jp = "0.4.0" regex = "1.10.2" +lazy_static = "1.4.0" [lib] diff --git a/minidisc-rs/src/netmd/base.rs b/minidisc-rs/src/netmd/base.rs index 167f998..3d3b1f4 100644 --- a/minidisc-rs/src/netmd/base.rs +++ b/minidisc-rs/src/netmd/base.rs @@ -231,10 +231,7 @@ impl NetMD { current_attempt += 1; } - match override_length { - Some(value) => length = value as u16, - None => (), - } + if let Some(value) = override_length { length = value as u16 } let request = match use_factory_command { false => 0x81, @@ -253,7 +250,7 @@ impl NetMD { length as usize ) { Ok(data) => Ok(data), - Err(error) => return Err(format!("USB error: {:?}", error).into()), + Err(error) => Err(format!("USB error: {:?}", error).into()), } } @@ -276,9 +273,8 @@ impl NetMD { while done < length { let to_read = std::cmp::min(chunksize, length - done); done -= to_read; - let mut buffer; - buffer = match self.device_connection.transfer_in( + let buffer = match self.device_connection.transfer_in( BULK_READ_ENDPOINT, to_read as usize, ) { @@ -286,13 +282,13 @@ impl NetMD { Err(error) => return Err(format!("USB error: {:?}", error).into()) }; - final_result.extend_from_slice(&mut buffer); + final_result.extend_from_slice(&buffer); } Ok(final_result) } - pub fn write_bulk(&mut self, data: &mut Vec) -> Result> { + pub fn write_bulk(&mut self, data: &mut [u8]) -> Result> { let written = match self.device_connection.transfer_out( BULK_WRITE_ENDPOINT, data diff --git a/minidisc-rs/src/netmd/interface.rs b/minidisc-rs/src/netmd/interface.rs index 2d6919f..ce8321e 100644 --- a/minidisc-rs/src/netmd/interface.rs +++ b/minidisc-rs/src/netmd/interface.rs @@ -9,10 +9,11 @@ use std::collections::HashMap; use std::error::Error; use magic_crypt::{MagicCrypt, SecureBit, MagicCryptTrait, new_magic_crypt}; use hex; -use once_cell::sync::Lazy; + use std::thread::sleep; use std::time::Duration; use webusb; +use lazy_static::lazy_static; #[derive(Copy, Clone)] enum Action { @@ -38,7 +39,7 @@ pub enum DiscFormat { #[derive(Clone, Hash, Eq, PartialEq)] enum WireFormat { - PCM = 0x00, + Pcm = 0x00, L105kbps = 0x90, LP2 = 0x94, LP4 = 0xA8, @@ -47,7 +48,7 @@ enum WireFormat { impl WireFormat { fn frame_size(&self) -> u16 { match self { - WireFormat::PCM => 2048, + WireFormat::Pcm => 2048, WireFormat::L105kbps => 192, WireFormat::LP2 => 152, WireFormat::LP4 => 96, @@ -105,7 +106,7 @@ enum Descriptor { DiscTitleTD, AudioUTOC1TD, AudioUTOC4TD, - DSITD, + Dstid, AudioContentsTD, RootTD, @@ -119,7 +120,7 @@ impl Descriptor { Descriptor::DiscTitleTD => vec![0x10, 0x18, 0x01], Descriptor::AudioUTOC1TD => vec![0x10, 0x18, 0x02], Descriptor::AudioUTOC4TD => vec![0x10, 0x18, 0x03], - Descriptor::DSITD => vec![0x10, 0x18, 0x04], + Descriptor::Dstid => vec![0x10, 0x18, 0x04], Descriptor::AudioContentsTD => vec![0x10, 0x10, 0x01], Descriptor::RootTD => vec![0x10, 0x10, 0x00], Descriptor::DiscSubunitIdentifier => vec![0x00], @@ -153,12 +154,14 @@ enum Status { Interim = 0x0f, } -const FRAME_SIZE: Lazy> = Lazy::new(|| HashMap::from([ - (WireFormat::PCM, 2048), - (WireFormat::LP2, 192), - (WireFormat::L105kbps, 152), - (WireFormat::LP4, 96), -])); +lazy_static!{ + static ref FRAME_SIZE: HashMap = HashMap::from([ + (WireFormat::Pcm, 2048), + (WireFormat::LP2, 192), + (WireFormat::L105kbps, 152), + (WireFormat::LP4, 96), + ]); +} impl std::convert::TryFrom for Status { type Error = Box; @@ -207,7 +210,7 @@ impl NetMDInterface { Ok(NetMDInterface { net_md_device }) } - fn construct_multibyte(&mut self, buffer: &Vec, n: u8, offset: &mut usize) -> u32 { + fn construct_multibyte(&mut self, buffer: &[u8], n: u8, offset: &mut usize) -> u32 { let mut output: u32 = 0; for _ in 0..n as usize { output <<= 8; @@ -369,7 +372,7 @@ impl NetMDInterface { while current_attempt < Self::MAX_INTERIM_READ_ATTEMPTS { data = match self.net_md_device.read_reply(None) { Ok(reply) => reply, - Err(error) => return Err(error.into()), + Err(error) => return Err(error), }; let status = match Status::try_from(data[0]) { @@ -819,8 +822,8 @@ impl NetMDInterface { if title.ends_with(delim) { let first_entry = title.split(delim).collect::>()[0]; - if first_entry.starts_with(title_marker) { - title = first_entry[title_marker.len()..].to_string(); + if let Some(stripped_title) = first_entry.strip_prefix(title_marker) { + title = stripped_title.to_string(); } else { title = String::new(); } @@ -842,19 +845,19 @@ impl NetMDInterface { let mut full_width_group_list = raw_full_title.split("//"); for (i, group) in group_list.enumerate() { - if group == "" { + if group.is_empty() { continue; } - if group.starts_with("0;") || group.find(";") == None || raw_title.find("//") == None { + if group.starts_with("0;") || group.find(';').is_none() || !raw_title.contains("//") { continue; } - let track_range: String = match group.split_once(";") { + let track_range: String = match group.split_once(';') { Some(string) => string.0.to_string(), None => return Err("No groups were found".into()), }; - if track_range.len() == 0 { + if track_range.is_empty() { continue; } @@ -865,15 +868,15 @@ impl NetMDInterface { let full_width_group_name = full_width_group_list .find(|n| n.starts_with(&full_width_range)) .unwrap() - .split_once(";") + .split_once(';') .unwrap() .1; let mut track_minmax: Vec<&str> = Vec::new(); - if track_range.find("-") != None { - track_minmax = track_range.split("-").collect(); + if track_range.find('-').is_some() { + track_minmax = track_range.split('-').collect(); } else { - track_minmax.push(&track_range.as_str()); + track_minmax.push(track_range.as_str()); } let (track_min, mut track_max) = ( @@ -881,7 +884,7 @@ impl NetMDInterface { track_minmax[1].parse::().unwrap(), ); - track_max = u16::min(track_max, track_count as u16); + track_max = u16::min(track_max, track_count); // TODO: Do some error handling here assert!(track_min <= track_max); @@ -904,7 +907,7 @@ impl NetMDInterface { )); } - for i in 0..track_count as u16 { + for i in 0..track_count { if !track_dict.contains_key(&i) { result.insert(0, (None, None, Vec::from([i]))) } @@ -1031,23 +1034,18 @@ impl NetMDInterface { }, }; - let old_len: u16; let new_len = new_title.len(); - match self.track_title(track, wchar) { + let old_len: u16 = match self.track_title(track, wchar) { Ok(current_title) => { if title == current_title { return Ok(()) } - old_len = length_after_encoding_to_jis(¤t_title) as u16; + length_after_encoding_to_jis(¤t_title) as u16 }, - Err(error) if error.to_string() == "Rejected" => { - old_len = 0; - }, - Err(error) => { - return Err(error); - } - } + Err(error) if error.to_string() == "Rejected" => 0, + Err(error) => return Err(error) + }; self.change_descriptor_state(&descriptor, &DescriptorAction::OpenWrite); let mut query = format_query( @@ -1114,7 +1112,7 @@ impl NetMDInterface { self.change_descriptor_state(&Descriptor::AudioContentsTD, &DescriptorAction::Close); - return Ok(res[0].to_vec().unwrap()); + Ok(res[0].to_vec().unwrap()) } /// Gets the length of tracks as a `std::time::Duration` from a set @@ -1327,7 +1325,7 @@ impl NetMDInterface { let chainlen = keychain.len(); let databytes = 16 + 16 * chainlen + 24; - if depth < 1 || depth > 63 { + if !(1..=63).contains(&depth) { return Err("Supplied depth is invalid".into()); } if ekbsignature.len() != 24 { @@ -1395,7 +1393,7 @@ impl NetMDInterface { return Err("Supplied Session Key length wrong".into()); } - let message = vec![vec![1, 1, 1, 1], contentid, keyenckey].concat(); + let message = [vec![1, 1, 1, 1], contentid, keyenckey].concat(); let mc = MagicCrypt::new( hex_session_key, @@ -1474,19 +1472,17 @@ impl NetMDInterface { // Sharps are slow sleep(Duration::from_millis(200)); - let mut packet_count = 0; - let mut written_bytes = 0; - for (key, iv, data) in packets { + let mut _written_bytes = 0; + for (packet_count, (key, iv, data)) in packets.into_iter().enumerate(){ let mut binpack; if packet_count == 0 { let packed_length: Vec = pkt_size.to_le_bytes().to_vec(); - binpack = vec![vec![0, 0, 0, 0], packed_length, key, iv, data.clone()].concat(); + binpack = [vec![0, 0, 0, 0], packed_length, key, iv, data.clone()].concat(); } else { binpack = data.clone(); } self.net_md_device.write_bulk(&mut binpack)?; - packet_count += 1; - written_bytes += data.len(); + _written_bytes += data.len(); } reply = self.read_reply(false)?; @@ -1501,8 +1497,8 @@ impl NetMDInterface { let reply_data = String::from_utf8(mc.decrypt_bytes_to_bytes(&res[1].to_vec().unwrap())?).unwrap().chars().collect::>(); - let part1 = String::from_iter(reply_data.clone()[0..8].into_iter()); - let part2 = String::from_iter(reply_data.clone()[12..32].into_iter()); + let part1 = String::from_iter(reply_data.clone()[0..8].iter()); + let part2 = String::from_iter(reply_data.clone()[12..32].iter()); Ok((res[0].to_i64().unwrap(), part1, part2)) } @@ -1539,7 +1535,7 @@ pub fn retailmac( ) -> Result<(), Box> { let subkey_a = key[0..8].to_vec(); let beginning = value[0..value.len() - 8].to_vec(); - let end = value[value.len() - 8..].to_vec(); + let _end = value[value.len() - 8..].to_vec(); let mc = MagicCrypt::new( String::from_utf8(subkey_a).unwrap(), @@ -1548,17 +1544,19 @@ pub fn retailmac( ); let step1 = mc.encrypt_bytes_to_bytes(&beginning); - let iv2 = String::from_utf8(step1); + let _iv2 = String::from_utf8(step1); Ok(()) } -const DISC_FOR_WIRE: Lazy> = Lazy::new(|| HashMap::from([ - (WireFormat::PCM, DiscFormat::SPStereo), - (WireFormat::LP2, DiscFormat::LP2), - (WireFormat::L105kbps, DiscFormat::LP2), - (WireFormat::LP4, DiscFormat::LP4), -])); +lazy_static!{ + static ref DISC_FOR_WIRE: HashMap = HashMap::from([ + (WireFormat::Pcm, DiscFormat::SPStereo), + (WireFormat::LP2, DiscFormat::LP2), + (WireFormat::L105kbps, DiscFormat::LP2), + (WireFormat::LP4, DiscFormat::LP4), + ]); +} struct EKBOpenSource { } diff --git a/minidisc-rs/src/netmd/mappings.rs b/minidisc-rs/src/netmd/mappings.rs index 10e6937..bc06079 100644 --- a/minidisc-rs/src/netmd/mappings.rs +++ b/minidisc-rs/src/netmd/mappings.rs @@ -1,556 +1,558 @@ -use once_cell::sync::Lazy; +use lazy_static::lazy_static; use std::collections::HashMap; -pub const MAPPINGS_JP: Lazy> = Lazy::new(|| {[ - ("!".to_string(), "!".to_string()), - ("\"".to_string(), """.to_string()), - ("#".to_string(), "#".to_string()), - ("$".to_string(), "$".to_string()), - ("%".to_string(), "%".to_string()), - ("&".to_string(), "&".to_string()), - ("'".to_string(), "'".to_string()), - ("(".to_string(), "(".to_string()), - (")".to_string(), ")".to_string()), - ("*".to_string(), "*".to_string()), - ("+".to_string(), "+".to_string()), - (",".to_string(), ",".to_string()), - ("-".to_string(), "-".to_string()), - (".".to_string(), ".".to_string()), - ("/".to_string(), "/".to_string()), - (":".to_string(), ":".to_string()), - (";".to_string(), ";".to_string()), - ("<".to_string(), "<".to_string()), - ("=".to_string(), "=".to_string()), - (">".to_string(), ">".to_string()), - ("?".to_string(), "?".to_string()), - ("@".to_string(), "@".to_string()), - ("A".to_string(), "A".to_string()), - ("B".to_string(), "B".to_string()), - ("C".to_string(), "C".to_string()), - ("D".to_string(), "D".to_string()), - ("E".to_string(), "E".to_string()), - ("F".to_string(), "F".to_string()), - ("G".to_string(), "G".to_string()), - ("H".to_string(), "H".to_string()), - ("I".to_string(), "I".to_string()), - ("J".to_string(), "J".to_string()), - ("K".to_string(), "K".to_string()), - ("L".to_string(), "L".to_string()), - ("M".to_string(), "M".to_string()), - ("N".to_string(), "N".to_string()), - ("O".to_string(), "O".to_string()), - ("P".to_string(), "P".to_string()), - ("Q".to_string(), "Q".to_string()), - ("R".to_string(), "R".to_string()), - ("S".to_string(), "S".to_string()), - ("T".to_string(), "T".to_string()), - ("U".to_string(), "U".to_string()), - ("V".to_string(), "V".to_string()), - ("W".to_string(), "W".to_string()), - ("X".to_string(), "X".to_string()), - ("Y".to_string(), "Y".to_string()), - ("Z".to_string(), "Z".to_string()), - ("[".to_string(), "[".to_string()), - ("\\".to_string(), "\".to_string()), - ("]".to_string(), "]".to_string()), - ("^".to_string(), "^".to_string()), - ("_".to_string(), "_".to_string()), - ("`".to_string(), "`".to_string()), - ("a".to_string(), "a".to_string()), - ("b".to_string(), "b".to_string()), - ("c".to_string(), "c".to_string()), - ("d".to_string(), "d".to_string()), - ("e".to_string(), "e".to_string()), - ("f".to_string(), "f".to_string()), - ("g".to_string(), "g".to_string()), - ("h".to_string(), "h".to_string()), - ("i".to_string(), "i".to_string()), - ("j".to_string(), "j".to_string()), - ("k".to_string(), "k".to_string()), - ("l".to_string(), "l".to_string()), - ("m".to_string(), "m".to_string()), - ("n".to_string(), "n".to_string()), - ("o".to_string(), "o".to_string()), - ("p".to_string(), "p".to_string()), - ("q".to_string(), "q".to_string()), - ("r".to_string(), "r".to_string()), - ("s".to_string(), "s".to_string()), - ("t".to_string(), "t".to_string()), - ("u".to_string(), "u".to_string()), - ("v".to_string(), "v".to_string()), - ("w".to_string(), "w".to_string()), - ("x".to_string(), "x".to_string()), - ("y".to_string(), "y".to_string()), - ("z".to_string(), "z".to_string()), - ("{".to_string(), "{".to_string()), - ("|".to_string(), "|".to_string()), - ("}".to_string(), "}".to_string()), - ("~".to_string(), "~".to_string()), - (" ".to_string(), "\u{3000}".to_string()), - ("0".to_string(), "0".to_string()), - ("1".to_string(), "1".to_string()), - ("2".to_string(), "2".to_string()), - ("3".to_string(), "3".to_string()), - ("4".to_string(), "4".to_string()), - ("5".to_string(), "5".to_string()), - ("6".to_string(), "6".to_string()), - ("7".to_string(), "7".to_string()), - ("8".to_string(), "8".to_string()), - ("9".to_string(), "9".to_string()), - ("ァ".to_string(), "ァ".to_string()), - ("ア".to_string(), "ア".to_string()), - ("ィ".to_string(), "ィ".to_string()), - ("イ".to_string(), "イ".to_string()), - ("ゥ".to_string(), "ゥ".to_string()), - ("ウ".to_string(), "ウ".to_string()), - ("ェ".to_string(), "ェ".to_string()), - ("エ".to_string(), "エ".to_string()), - ("ォ".to_string(), "ォ".to_string()), - ("オ".to_string(), "オ".to_string()), - ("カ".to_string(), "カ".to_string()), - ("ガ".to_string(), "ガ".to_string()), - ("キ".to_string(), "キ".to_string()), - ("ギ".to_string(), "ギ".to_string()), - ("ク".to_string(), "ク".to_string()), - ("グ".to_string(), "グ".to_string()), - ("ケ".to_string(), "ケ".to_string()), - ("ゲ".to_string(), "ゲ".to_string()), - ("コ".to_string(), "コ".to_string()), - ("ゴ".to_string(), "ゴ".to_string()), - ("サ".to_string(), "サ".to_string()), - ("ザ".to_string(), "ザ".to_string()), - ("シ".to_string(), "シ".to_string()), - ("ジ".to_string(), "ジ".to_string()), - ("ス".to_string(), "ス".to_string()), - ("ズ".to_string(), "ズ".to_string()), - ("セ".to_string(), "セ".to_string()), - ("ゼ".to_string(), "ゼ".to_string()), - ("ソ".to_string(), "ソ".to_string()), - ("ゾ".to_string(), "ゾ".to_string()), - ("タ".to_string(), "タ".to_string()), - ("ダ".to_string(), "ダ".to_string()), - ("チ".to_string(), "チ".to_string()), - ("ヂ".to_string(), "ヂ".to_string()), - ("ッ".to_string(), "ッ".to_string()), - ("ツ".to_string(), "ツ".to_string()), - ("ヅ".to_string(), "ヅ".to_string()), - ("テ".to_string(), "テ".to_string()), - ("デ".to_string(), "デ".to_string()), - ("ト".to_string(), "ト".to_string()), - ("ド".to_string(), "ド".to_string()), - ("ナ".to_string(), "ナ".to_string()), - ("ニ".to_string(), "ニ".to_string()), - ("ヌ".to_string(), "ヌ".to_string()), - ("ネ".to_string(), "ネ".to_string()), - ("ノ".to_string(), "ノ".to_string()), - ("ハ".to_string(), "ハ".to_string()), - ("バ".to_string(), "バ".to_string()), - ("パ".to_string(), "パ".to_string()), - ("ヒ".to_string(), "ヒ".to_string()), - ("ビ".to_string(), "ビ".to_string()), - ("ピ".to_string(), "ピ".to_string()), - ("フ".to_string(), "フ".to_string()), - ("ブ".to_string(), "ブ".to_string()), - ("プ".to_string(), "プ".to_string()), - ("ヘ".to_string(), "ヘ".to_string()), - ("ベ".to_string(), "ベ".to_string()), - ("ペ".to_string(), "ペ".to_string()), - ("ホ".to_string(), "ホ".to_string()), - ("ボ".to_string(), "ボ".to_string()), - ("ポ".to_string(), "ポ".to_string()), - ("マ".to_string(), "マ".to_string()), - ("ミ".to_string(), "ミ".to_string()), - ("ム".to_string(), "ム".to_string()), - ("メ".to_string(), "メ".to_string()), - ("モ".to_string(), "モ".to_string()), - ("ャ".to_string(), "ャ".to_string()), - ("ヤ".to_string(), "ヤ".to_string()), - ("ュ".to_string(), "ュ".to_string()), - ("ユ".to_string(), "ユ".to_string()), - ("ョ".to_string(), "ョ".to_string()), - ("ヨ".to_string(), "ヨ".to_string()), - ("ラ".to_string(), "ラ".to_string()), - ("リ".to_string(), "リ".to_string()), - ("ル".to_string(), "ル".to_string()), - ("レ".to_string(), "レ".to_string()), - ("ロ".to_string(), "ロ".to_string()), - ("ワ".to_string(), "ワ".to_string()), - ("ヲ".to_string(), "ヲ".to_string()), - ("ン".to_string(), "ン".to_string()), - ("ー".to_string(), "ー".to_string()), - ("ヮ".to_string(), "ヮ".to_string()), - ("ヰ".to_string(), "ヰ".to_string()), - ("ヱ".to_string(), "ヱ".to_string()), - ("ヵ".to_string(), "ヵ".to_string()), - ("ヶ".to_string(), "ヶ".to_string()), - ("ヴ".to_string(), "ヴ".to_string()), - ("ヽ".to_string(), "ヽ".to_string()), - ("ヾ".to_string(), "ヾ".to_string()), - ("・".to_string(), "・".to_string()), - ("「".to_string(), "「".to_string()), - ("」".to_string(), "」".to_string()), - ("。".to_string(), "。".to_string()), - ("、".to_string(), "、".to_string()) -].into_iter().collect()}); +lazy_static! { + pub static ref MAPPINGS_JP: HashMap = HashMap::from([ + ("!".to_string(), "!".to_string()), + ("\"".to_string(), """.to_string()), + ("#".to_string(), "#".to_string()), + ("$".to_string(), "$".to_string()), + ("%".to_string(), "%".to_string()), + ("&".to_string(), "&".to_string()), + ("'".to_string(), "'".to_string()), + ("(".to_string(), "(".to_string()), + (")".to_string(), ")".to_string()), + ("*".to_string(), "*".to_string()), + ("+".to_string(), "+".to_string()), + (",".to_string(), ",".to_string()), + ("-".to_string(), "-".to_string()), + (".".to_string(), ".".to_string()), + ("/".to_string(), "/".to_string()), + (":".to_string(), ":".to_string()), + (";".to_string(), ";".to_string()), + ("<".to_string(), "<".to_string()), + ("=".to_string(), "=".to_string()), + (">".to_string(), ">".to_string()), + ("?".to_string(), "?".to_string()), + ("@".to_string(), "@".to_string()), + ("A".to_string(), "A".to_string()), + ("B".to_string(), "B".to_string()), + ("C".to_string(), "C".to_string()), + ("D".to_string(), "D".to_string()), + ("E".to_string(), "E".to_string()), + ("F".to_string(), "F".to_string()), + ("G".to_string(), "G".to_string()), + ("H".to_string(), "H".to_string()), + ("I".to_string(), "I".to_string()), + ("J".to_string(), "J".to_string()), + ("K".to_string(), "K".to_string()), + ("L".to_string(), "L".to_string()), + ("M".to_string(), "M".to_string()), + ("N".to_string(), "N".to_string()), + ("O".to_string(), "O".to_string()), + ("P".to_string(), "P".to_string()), + ("Q".to_string(), "Q".to_string()), + ("R".to_string(), "R".to_string()), + ("S".to_string(), "S".to_string()), + ("T".to_string(), "T".to_string()), + ("U".to_string(), "U".to_string()), + ("V".to_string(), "V".to_string()), + ("W".to_string(), "W".to_string()), + ("X".to_string(), "X".to_string()), + ("Y".to_string(), "Y".to_string()), + ("Z".to_string(), "Z".to_string()), + ("[".to_string(), "[".to_string()), + ("\\".to_string(), "\".to_string()), + ("]".to_string(), "]".to_string()), + ("^".to_string(), "^".to_string()), + ("_".to_string(), "_".to_string()), + ("`".to_string(), "`".to_string()), + ("a".to_string(), "a".to_string()), + ("b".to_string(), "b".to_string()), + ("c".to_string(), "c".to_string()), + ("d".to_string(), "d".to_string()), + ("e".to_string(), "e".to_string()), + ("f".to_string(), "f".to_string()), + ("g".to_string(), "g".to_string()), + ("h".to_string(), "h".to_string()), + ("i".to_string(), "i".to_string()), + ("j".to_string(), "j".to_string()), + ("k".to_string(), "k".to_string()), + ("l".to_string(), "l".to_string()), + ("m".to_string(), "m".to_string()), + ("n".to_string(), "n".to_string()), + ("o".to_string(), "o".to_string()), + ("p".to_string(), "p".to_string()), + ("q".to_string(), "q".to_string()), + ("r".to_string(), "r".to_string()), + ("s".to_string(), "s".to_string()), + ("t".to_string(), "t".to_string()), + ("u".to_string(), "u".to_string()), + ("v".to_string(), "v".to_string()), + ("w".to_string(), "w".to_string()), + ("x".to_string(), "x".to_string()), + ("y".to_string(), "y".to_string()), + ("z".to_string(), "z".to_string()), + ("{".to_string(), "{".to_string()), + ("|".to_string(), "|".to_string()), + ("}".to_string(), "}".to_string()), + ("~".to_string(), "~".to_string()), + (" ".to_string(), "\u{3000}".to_string()), + ("0".to_string(), "0".to_string()), + ("1".to_string(), "1".to_string()), + ("2".to_string(), "2".to_string()), + ("3".to_string(), "3".to_string()), + ("4".to_string(), "4".to_string()), + ("5".to_string(), "5".to_string()), + ("6".to_string(), "6".to_string()), + ("7".to_string(), "7".to_string()), + ("8".to_string(), "8".to_string()), + ("9".to_string(), "9".to_string()), + ("ァ".to_string(), "ァ".to_string()), + ("ア".to_string(), "ア".to_string()), + ("ィ".to_string(), "ィ".to_string()), + ("イ".to_string(), "イ".to_string()), + ("ゥ".to_string(), "ゥ".to_string()), + ("ウ".to_string(), "ウ".to_string()), + ("ェ".to_string(), "ェ".to_string()), + ("エ".to_string(), "エ".to_string()), + ("ォ".to_string(), "ォ".to_string()), + ("オ".to_string(), "オ".to_string()), + ("カ".to_string(), "カ".to_string()), + ("ガ".to_string(), "ガ".to_string()), + ("キ".to_string(), "キ".to_string()), + ("ギ".to_string(), "ギ".to_string()), + ("ク".to_string(), "ク".to_string()), + ("グ".to_string(), "グ".to_string()), + ("ケ".to_string(), "ケ".to_string()), + ("ゲ".to_string(), "ゲ".to_string()), + ("コ".to_string(), "コ".to_string()), + ("ゴ".to_string(), "ゴ".to_string()), + ("サ".to_string(), "サ".to_string()), + ("ザ".to_string(), "ザ".to_string()), + ("シ".to_string(), "シ".to_string()), + ("ジ".to_string(), "ジ".to_string()), + ("ス".to_string(), "ス".to_string()), + ("ズ".to_string(), "ズ".to_string()), + ("セ".to_string(), "セ".to_string()), + ("ゼ".to_string(), "ゼ".to_string()), + ("ソ".to_string(), "ソ".to_string()), + ("ゾ".to_string(), "ゾ".to_string()), + ("タ".to_string(), "タ".to_string()), + ("ダ".to_string(), "ダ".to_string()), + ("チ".to_string(), "チ".to_string()), + ("ヂ".to_string(), "ヂ".to_string()), + ("ッ".to_string(), "ッ".to_string()), + ("ツ".to_string(), "ツ".to_string()), + ("ヅ".to_string(), "ヅ".to_string()), + ("テ".to_string(), "テ".to_string()), + ("デ".to_string(), "デ".to_string()), + ("ト".to_string(), "ト".to_string()), + ("ド".to_string(), "ド".to_string()), + ("ナ".to_string(), "ナ".to_string()), + ("ニ".to_string(), "ニ".to_string()), + ("ヌ".to_string(), "ヌ".to_string()), + ("ネ".to_string(), "ネ".to_string()), + ("ノ".to_string(), "ノ".to_string()), + ("ハ".to_string(), "ハ".to_string()), + ("バ".to_string(), "バ".to_string()), + ("パ".to_string(), "パ".to_string()), + ("ヒ".to_string(), "ヒ".to_string()), + ("ビ".to_string(), "ビ".to_string()), + ("ピ".to_string(), "ピ".to_string()), + ("フ".to_string(), "フ".to_string()), + ("ブ".to_string(), "ブ".to_string()), + ("プ".to_string(), "プ".to_string()), + ("ヘ".to_string(), "ヘ".to_string()), + ("ベ".to_string(), "ベ".to_string()), + ("ペ".to_string(), "ペ".to_string()), + ("ホ".to_string(), "ホ".to_string()), + ("ボ".to_string(), "ボ".to_string()), + ("ポ".to_string(), "ポ".to_string()), + ("マ".to_string(), "マ".to_string()), + ("ミ".to_string(), "ミ".to_string()), + ("ム".to_string(), "ム".to_string()), + ("メ".to_string(), "メ".to_string()), + ("モ".to_string(), "モ".to_string()), + ("ャ".to_string(), "ャ".to_string()), + ("ヤ".to_string(), "ヤ".to_string()), + ("ュ".to_string(), "ュ".to_string()), + ("ユ".to_string(), "ユ".to_string()), + ("ョ".to_string(), "ョ".to_string()), + ("ヨ".to_string(), "ヨ".to_string()), + ("ラ".to_string(), "ラ".to_string()), + ("リ".to_string(), "リ".to_string()), + ("ル".to_string(), "ル".to_string()), + ("レ".to_string(), "レ".to_string()), + ("ロ".to_string(), "ロ".to_string()), + ("ワ".to_string(), "ワ".to_string()), + ("ヲ".to_string(), "ヲ".to_string()), + ("ン".to_string(), "ン".to_string()), + ("ー".to_string(), "ー".to_string()), + ("ヮ".to_string(), "ヮ".to_string()), + ("ヰ".to_string(), "ヰ".to_string()), + ("ヱ".to_string(), "ヱ".to_string()), + ("ヵ".to_string(), "ヵ".to_string()), + ("ヶ".to_string(), "ヶ".to_string()), + ("ヴ".to_string(), "ヴ".to_string()), + ("ヽ".to_string(), "ヽ".to_string()), + ("ヾ".to_string(), "ヾ".to_string()), + ("・".to_string(), "・".to_string()), + ("「".to_string(), "「".to_string()), + ("」".to_string(), "」".to_string()), + ("。".to_string(), "。".to_string()), + ("、".to_string(), "、".to_string()) + ]); -pub const MAPPINGS_RU: Lazy> = Lazy::new(|| {[ - ("а".to_string(), "a".to_string()), - ("б".to_string(), "b".to_string()), - ("в".to_string(), "v".to_string()), - ("г".to_string(), "g".to_string()), - ("д".to_string(), "d".to_string()), - ("е".to_string(), "e".to_string()), - ("ё".to_string(), "e".to_string()), - ("ж".to_string(), "zh".to_string()), - ("з".to_string(), "z".to_string()), - ("и".to_string(), "i".to_string()), - ("й".to_string(), "i".to_string()), - ("к".to_string(), "k".to_string()), - ("л".to_string(), "l".to_string()), - ("м".to_string(), "m".to_string()), - ("н".to_string(), "n".to_string()), - ("о".to_string(), "o".to_string()), - ("п".to_string(), "p".to_string()), - ("р".to_string(), "r".to_string()), - ("с".to_string(), "s".to_string()), - ("т".to_string(), "t".to_string()), - ("у".to_string(), "u".to_string()), - ("ф".to_string(), "f".to_string()), - ("х".to_string(), "kh".to_string()), - ("ц".to_string(), "tc".to_string()), - ("ч".to_string(), "ch".to_string()), - ("ш".to_string(), "sh".to_string()), - ("щ".to_string(), "shch".to_string()), - ("ъ".to_string(), "".to_string()), - ("ы".to_string(), "y".to_string()), - ("ь".to_string(), "'".to_string()), - ("э".to_string(), "e".to_string()), - ("ю".to_string(), "iu".to_string()), - ("я".to_string(), "ia".to_string()), - ("А".to_string(), "A".to_string()), - ("Б".to_string(), "B".to_string()), - ("В".to_string(), "V".to_string()), - ("Г".to_string(), "G".to_string()), - ("Д".to_string(), "D".to_string()), - ("Е".to_string(), "E".to_string()), - ("Ё".to_string(), "E".to_string()), - ("Ж".to_string(), "Zh".to_string()), - ("З".to_string(), "Z".to_string()), - ("И".to_string(), "I".to_string()), - ("Й".to_string(), "I".to_string()), - ("К".to_string(), "K".to_string()), - ("Л".to_string(), "L".to_string()), - ("М".to_string(), "M".to_string()), - ("Н".to_string(), "N".to_string()), - ("О".to_string(), "O".to_string()), - ("П".to_string(), "P".to_string()), - ("Р".to_string(), "R".to_string()), - ("С".to_string(), "S".to_string()), - ("Т".to_string(), "T".to_string()), - ("У".to_string(), "U".to_string()), - ("Ф".to_string(), "F".to_string()), - ("Х".to_string(), "Kh".to_string()), - ("Ц".to_string(), "Tc".to_string()), - ("Ч".to_string(), "Ch".to_string()), - ("Ш".to_string(), "Sh".to_string()), - ("Щ".to_string(), "Shch".to_string()), - ("Ъ".to_string(), "".to_string()), - ("Ы".to_string(), "Y".to_string()), - ("Ь".to_string(), "'".to_string()), - ("Э".to_string(), "E".to_string()), - ("Ю".to_string(), "Iu".to_string()), - ("Я".to_string(), "Ia".to_string()) -].into_iter().collect()}); + pub static ref MAPPINGS_RU: HashMap = HashMap::from([ + ("а".to_string(), "a".to_string()), + ("б".to_string(), "b".to_string()), + ("в".to_string(), "v".to_string()), + ("г".to_string(), "g".to_string()), + ("д".to_string(), "d".to_string()), + ("е".to_string(), "e".to_string()), + ("ё".to_string(), "e".to_string()), + ("ж".to_string(), "zh".to_string()), + ("з".to_string(), "z".to_string()), + ("и".to_string(), "i".to_string()), + ("й".to_string(), "i".to_string()), + ("к".to_string(), "k".to_string()), + ("л".to_string(), "l".to_string()), + ("м".to_string(), "m".to_string()), + ("н".to_string(), "n".to_string()), + ("о".to_string(), "o".to_string()), + ("п".to_string(), "p".to_string()), + ("р".to_string(), "r".to_string()), + ("с".to_string(), "s".to_string()), + ("т".to_string(), "t".to_string()), + ("у".to_string(), "u".to_string()), + ("ф".to_string(), "f".to_string()), + ("х".to_string(), "kh".to_string()), + ("ц".to_string(), "tc".to_string()), + ("ч".to_string(), "ch".to_string()), + ("ш".to_string(), "sh".to_string()), + ("щ".to_string(), "shch".to_string()), + ("ъ".to_string(), "".to_string()), + ("ы".to_string(), "y".to_string()), + ("ь".to_string(), "'".to_string()), + ("э".to_string(), "e".to_string()), + ("ю".to_string(), "iu".to_string()), + ("я".to_string(), "ia".to_string()), + ("А".to_string(), "A".to_string()), + ("Б".to_string(), "B".to_string()), + ("В".to_string(), "V".to_string()), + ("Г".to_string(), "G".to_string()), + ("Д".to_string(), "D".to_string()), + ("Е".to_string(), "E".to_string()), + ("Ё".to_string(), "E".to_string()), + ("Ж".to_string(), "Zh".to_string()), + ("З".to_string(), "Z".to_string()), + ("И".to_string(), "I".to_string()), + ("Й".to_string(), "I".to_string()), + ("К".to_string(), "K".to_string()), + ("Л".to_string(), "L".to_string()), + ("М".to_string(), "M".to_string()), + ("Н".to_string(), "N".to_string()), + ("О".to_string(), "O".to_string()), + ("П".to_string(), "P".to_string()), + ("Р".to_string(), "R".to_string()), + ("С".to_string(), "S".to_string()), + ("Т".to_string(), "T".to_string()), + ("У".to_string(), "U".to_string()), + ("Ф".to_string(), "F".to_string()), + ("Х".to_string(), "Kh".to_string()), + ("Ц".to_string(), "Tc".to_string()), + ("Ч".to_string(), "Ch".to_string()), + ("Ш".to_string(), "Sh".to_string()), + ("Щ".to_string(), "Shch".to_string()), + ("Ъ".to_string(), "".to_string()), + ("Ы".to_string(), "Y".to_string()), + ("Ь".to_string(), "'".to_string()), + ("Э".to_string(), "E".to_string()), + ("Ю".to_string(), "Iu".to_string()), + ("Я".to_string(), "Ia".to_string()) + ]); -pub const MAPPINGS_DE: Lazy> = Lazy::new(|| {[ - ("Ä".to_string(), "Ae".to_string()), - ("ä".to_string(), "ae".to_string()), - ("Ö".to_string(), "Oe".to_string()), - ("ö".to_string(), "oe".to_string()), - ("Ü".to_string(), "Ue".to_string()), - ("ü".to_string(), "ue".to_string()), - ("ß".to_string(), "ss".to_string()) -].into_iter().collect()}); + pub static ref MAPPINGS_DE: HashMap = HashMap::from([ + ("Ä".to_string(), "Ae".to_string()), + ("ä".to_string(), "ae".to_string()), + ("Ö".to_string(), "Oe".to_string()), + ("ö".to_string(), "oe".to_string()), + ("Ü".to_string(), "Ue".to_string()), + ("ü".to_string(), "ue".to_string()), + ("ß".to_string(), "ss".to_string()) + ]); -pub const MAPPINGS_HW: Lazy> = Lazy::new(|| {[ - ("-".to_string(),"-".to_string()), - ("ー".to_string(),"-".to_string()), - ("ァ".to_string(),"ァ".to_string()), - ("ア".to_string(),"ア".to_string()), - ("ィ".to_string(),"ィ".to_string()), - ("イ".to_string(),"イ".to_string()), - ("ゥ".to_string(),"ゥ".to_string()), - ("ウ".to_string(),"ウ".to_string()), - ("ェ".to_string(),"ェ".to_string()), - ("エ".to_string(),"エ".to_string()), - ("ォ".to_string(),"ォ".to_string()), - ("オ".to_string(),"オ".to_string()), - ("カ".to_string(),"カ".to_string()), - ("ガ".to_string(),"ガ".to_string()), - ("キ".to_string(),"キ".to_string()), - ("ギ".to_string(),"ギ".to_string()), - ("ク".to_string(),"ク".to_string()), - ("グ".to_string(),"グ".to_string()), - ("ケ".to_string(),"ケ".to_string()), - ("ゲ".to_string(),"ゲ".to_string()), - ("コ".to_string(),"コ".to_string()), - ("ゴ".to_string(),"ゴ".to_string()), - ("サ".to_string(),"サ".to_string()), - ("ザ".to_string(),"ザ".to_string()), - ("シ".to_string(),"シ".to_string()), - ("ジ".to_string(),"ジ".to_string()), - ("ス".to_string(),"ス".to_string()), - ("ズ".to_string(),"ズ".to_string()), - ("セ".to_string(),"セ".to_string()), - ("ゼ".to_string(),"ゼ".to_string()), - ("ソ".to_string(),"ソ".to_string()), - ("ゾ".to_string(),"ゾ".to_string()), - ("タ".to_string(),"タ".to_string()), - ("ダ".to_string(),"ダ".to_string()), - ("チ".to_string(),"チ".to_string()), - ("ヂ".to_string(),"ヂ".to_string()), - ("ッ".to_string(),"ッ".to_string()), - ("ツ".to_string(),"ツ".to_string()), - ("ヅ".to_string(),"ヅ".to_string()), - ("テ".to_string(),"テ".to_string()), - ("デ".to_string(),"デ".to_string()), - ("ト".to_string(),"ト".to_string()), - ("ド".to_string(),"ド".to_string()), - ("ナ".to_string(),"ナ".to_string()), - ("ニ".to_string(),"ニ".to_string()), - ("ヌ".to_string(),"ヌ".to_string()), - ("ネ".to_string(),"ネ".to_string()), - ("ノ".to_string(),"ノ".to_string()), - ("ハ".to_string(),"ハ".to_string()), - ("バ".to_string(),"バ".to_string()), - ("パ".to_string(),"パ".to_string()), - ("ヒ".to_string(),"ヒ".to_string()), - ("ビ".to_string(),"ビ".to_string()), - ("ピ".to_string(),"ピ".to_string()), - ("フ".to_string(),"フ".to_string()), - ("ブ".to_string(),"ブ".to_string()), - ("プ".to_string(),"プ".to_string()), - ("ヘ".to_string(),"ヘ".to_string()), - ("ベ".to_string(),"ベ".to_string()), - ("ペ".to_string(),"ペ".to_string()), - ("ホ".to_string(),"ホ".to_string()), - ("ボ".to_string(),"ボ".to_string()), - ("ポ".to_string(),"ポ".to_string()), - ("マ".to_string(),"マ".to_string()), - ("ミ".to_string(),"ミ".to_string()), - ("ム".to_string(),"ム".to_string()), - ("メ".to_string(),"メ".to_string()), - ("モ".to_string(),"モ".to_string()), - ("ャ".to_string(),"ャ".to_string()), - ("ヤ".to_string(),"ヤ".to_string()), - ("ュ".to_string(),"ュ".to_string()), - ("ユ".to_string(),"ユ".to_string()), - ("ョ".to_string(),"ョ".to_string()), - ("ヨ".to_string(),"ヨ".to_string()), - ("ラ".to_string(),"ラ".to_string()), - ("リ".to_string(),"リ".to_string()), - ("ル".to_string(),"ル".to_string()), - ("レ".to_string(),"レ".to_string()), - ("ロ".to_string(),"ロ".to_string()), - ("ワ".to_string(),"ワ".to_string()), - ("ヲ".to_string(),"ヲ".to_string()), - ("ン".to_string(),"ン".to_string()), - ("ー".to_string(),"-".to_string()), - ("ヮ".to_string(),"ヮ".to_string()), - ("ヰ".to_string(),"ヰ".to_string()), - ("ヱ".to_string(),"ヱ".to_string()), - ("ヵ".to_string(),"ヵ".to_string()), - ("ヶ".to_string(),"ヶ".to_string()), - ("ヴ".to_string(),"ヴ".to_string()), - ("ヽ".to_string(),"ヽ".to_string()), - ("ヾ".to_string(),"ヾ".to_string()), - ("・".to_string(),"・".to_string()), - ("「".to_string(),"「".to_string()), - ("」".to_string(),"」".to_string()), - ("。".to_string(),"。".to_string()), - ("、".to_string(),"、".to_string()), - ("!".to_string(),"!".to_string()), - (""".to_string(),"\"".to_string()), - ("#".to_string(),"#".to_string()), - ("$".to_string(),"$".to_string()), - ("%".to_string(),"%".to_string()), - ("&".to_string(),"&".to_string()), - ("'".to_string(),"'".to_string()), - ("(".to_string(),"(".to_string()), - (")".to_string(),")".to_string()), - ("*".to_string(),"*".to_string()), - ("+".to_string(),"+".to_string()), - (",".to_string(),",".to_string()), - (".".to_string(),".".to_string()), - ("/".to_string(),"/".to_string()), - (":".to_string(),":".to_string()), - (";".to_string(),";".to_string()), - ("<".to_string(),"<".to_string()), - ("=".to_string(),"=".to_string()), - (">".to_string(),">".to_string()), - ("?".to_string(),"?".to_string()), - ("@".to_string(),"@".to_string()), - ("A".to_string(),"A".to_string()), - ("B".to_string(),"B".to_string()), - ("C".to_string(),"C".to_string()), - ("D".to_string(),"D".to_string()), - ("E".to_string(),"E".to_string()), - ("F".to_string(),"F".to_string()), - ("G".to_string(),"G".to_string()), - ("H".to_string(),"H".to_string()), - ("I".to_string(),"I".to_string()), - ("J".to_string(),"J".to_string()), - ("K".to_string(),"K".to_string()), - ("L".to_string(),"L".to_string()), - ("M".to_string(),"M".to_string()), - ("N".to_string(),"N".to_string()), - ("O".to_string(),"O".to_string()), - ("P".to_string(),"P".to_string()), - ("Q".to_string(),"Q".to_string()), - ("R".to_string(),"R".to_string()), - ("S".to_string(),"S".to_string()), - ("T".to_string(),"T".to_string()), - ("U".to_string(),"U".to_string()), - ("V".to_string(),"V".to_string()), - ("W".to_string(),"W".to_string()), - ("X".to_string(),"X".to_string()), - ("Y".to_string(),"Y".to_string()), - ("Z".to_string(),"Z".to_string()), - ("[".to_string(),"[".to_string()), - ("\".to_string(),"\\".to_string()), - ("]".to_string(),"]".to_string()), - ("^".to_string(),"^".to_string()), - ("_".to_string(),"_".to_string()), - ("`".to_string(),"`".to_string()), - ("a".to_string(),"a".to_string()), - ("b".to_string(),"b".to_string()), - ("c".to_string(),"c".to_string()), - ("d".to_string(),"d".to_string()), - ("e".to_string(),"e".to_string()), - ("f".to_string(),"f".to_string()), - ("g".to_string(),"g".to_string()), - ("h".to_string(),"h".to_string()), - ("i".to_string(),"i".to_string()), - ("j".to_string(),"j".to_string()), - ("k".to_string(),"k".to_string()), - ("l".to_string(),"l".to_string()), - ("m".to_string(),"m".to_string()), - ("n".to_string(),"n".to_string()), - ("o".to_string(),"o".to_string()), - ("p".to_string(),"p".to_string()), - ("q".to_string(),"q".to_string()), - ("r".to_string(),"r".to_string()), - ("s".to_string(),"s".to_string()), - ("t".to_string(),"t".to_string()), - ("u".to_string(),"u".to_string()), - ("v".to_string(),"v".to_string()), - ("w".to_string(),"w".to_string()), - ("x".to_string(),"x".to_string()), - ("y".to_string(),"y".to_string()), - ("z".to_string(),"z".to_string()), - ("{".to_string(),"{".to_string()), - ("|".to_string(),"|".to_string()), - ("}".to_string(),"}".to_string()), - ("~".to_string(),"~".to_string()), - (" ".to_string()," ".to_string()), - ("0".to_string(),"0".to_string()), - ("1".to_string(),"1".to_string()), - ("2".to_string(),"2".to_string()), - ("3".to_string(),"3".to_string()), - ("4".to_string(),"4".to_string()), - ("5".to_string(),"5".to_string()), - ("6".to_string(),"6".to_string()), - ("7".to_string(),"7".to_string()), - ("8".to_string(),"8".to_string()), - ("9".to_string(),"9".to_string()), - ("ぁ".to_string(),"ァ".to_string()), - ("あ".to_string(),"ア".to_string()), - ("ぃ".to_string(),"ィ".to_string()), - ("い".to_string(),"イ".to_string()), - ("ぅ".to_string(),"ゥ".to_string()), - ("う".to_string(),"ウ".to_string()), - ("ぇ".to_string(),"ェ".to_string()), - ("え".to_string(),"エ".to_string()), - ("ぉ".to_string(),"ォ".to_string()), - ("お".to_string(),"オ".to_string()), - ("か".to_string(),"カ".to_string()), - ("が".to_string(),"ガ".to_string()), - ("き".to_string(),"キ".to_string()), - ("ぎ".to_string(),"ギ".to_string()), - ("く".to_string(),"ク".to_string()), - ("ぐ".to_string(),"グ".to_string()), - ("け".to_string(),"ケ".to_string()), - ("げ".to_string(),"ゲ".to_string()), - ("こ".to_string(),"コ".to_string()), - ("ご".to_string(),"ゴ".to_string()), - ("さ".to_string(),"サ".to_string()), - ("ざ".to_string(),"ザ".to_string()), - ("し".to_string(),"シ".to_string()), - ("じ".to_string(),"ジ".to_string()), - ("す".to_string(),"ス".to_string()), - ("ず".to_string(),"ズ".to_string()), - ("せ".to_string(),"セ".to_string()), - ("ぜ".to_string(),"ゼ".to_string()), - ("そ".to_string(),"ソ".to_string()), - ("ぞ".to_string(),"ゾ".to_string()), - ("た".to_string(),"タ".to_string()), - ("だ".to_string(),"ダ".to_string()), - ("ち".to_string(),"チ".to_string()), - ("ぢ".to_string(),"ヂ".to_string()), - ("っ".to_string(),"ッ".to_string()), - ("つ".to_string(),"ツ".to_string()), - ("づ".to_string(),"ヅ".to_string()), - ("て".to_string(),"テ".to_string()), - ("で".to_string(),"デ".to_string()), - ("と".to_string(),"ト".to_string()), - ("ど".to_string(),"ド".to_string()), - ("な".to_string(),"ナ".to_string()), - ("に".to_string(),"ニ".to_string()), - ("ぬ".to_string(),"ヌ".to_string()), - ("ね".to_string(),"ネ".to_string()), - ("の".to_string(),"ノ".to_string()), - ("は".to_string(),"ハ".to_string()), - ("ば".to_string(),"バ".to_string()), - ("ぱ".to_string(),"パ".to_string()), - ("ひ".to_string(),"ヒ".to_string()), - ("び".to_string(),"ビ".to_string()), - ("ぴ".to_string(),"ピ".to_string()), - ("ふ".to_string(),"フ".to_string()), - ("ぶ".to_string(),"ブ".to_string()), - ("ぷ".to_string(),"プ".to_string()), - ("へ".to_string(),"ヘ".to_string()), - ("べ".to_string(),"ベ".to_string()), - ("ぺ".to_string(),"ペ".to_string()), - ("ほ".to_string(),"ホ".to_string()), - ("ぼ".to_string(),"ボ".to_string()), - ("ぽ".to_string(),"ポ".to_string()), - ("ま".to_string(),"マ".to_string()), - ("み".to_string(),"ミ".to_string()), - ("む".to_string(),"ム".to_string()), - ("め".to_string(),"メ".to_string()), - ("も".to_string(),"モ".to_string()), - ("ゃ".to_string(),"ャ".to_string()), - ("や".to_string(),"ヤ".to_string()), - ("ゅ".to_string(),"ュ".to_string()), - ("ゆ".to_string(),"ユ".to_string()), - ("ょ".to_string(),"ョ".to_string()), - ("よ".to_string(),"ヨ".to_string()), - ("ら".to_string(),"ラ".to_string()), - ("り".to_string(),"リ".to_string()), - ("る".to_string(),"ル".to_string()), - ("れ".to_string(),"レ".to_string()), - ("ろ".to_string(),"ロ".to_string()), - ("わ".to_string(),"ワ".to_string()), - ("を".to_string(),"ヲ".to_string()), - ("ん".to_string(),"ン".to_string()), - ("ゎ".to_string(),"ヮ".to_string()), - ("ゐ".to_string(),"ヰ".to_string()), - ("ゑ".to_string(),"ヱ".to_string()), - ("ゕ".to_string(),"ヵ".to_string()), - ("ゖ".to_string(),"ヶ".to_string()), - ("ゔ".to_string(),"ヴ".to_string()), - ("ゝ".to_string(),"ヽ".to_string()), - ("ゞ".to_string(),"ヾ".to_string()), -].into_iter().collect()}); + pub static ref MAPPINGS_HW: HashMap = HashMap::from([ + ("-".to_string(),"-".to_string()), + ("ー".to_string(),"-".to_string()), + ("ァ".to_string(),"ァ".to_string()), + ("ア".to_string(),"ア".to_string()), + ("ィ".to_string(),"ィ".to_string()), + ("イ".to_string(),"イ".to_string()), + ("ゥ".to_string(),"ゥ".to_string()), + ("ウ".to_string(),"ウ".to_string()), + ("ェ".to_string(),"ェ".to_string()), + ("エ".to_string(),"エ".to_string()), + ("ォ".to_string(),"ォ".to_string()), + ("オ".to_string(),"オ".to_string()), + ("カ".to_string(),"カ".to_string()), + ("ガ".to_string(),"ガ".to_string()), + ("キ".to_string(),"キ".to_string()), + ("ギ".to_string(),"ギ".to_string()), + ("ク".to_string(),"ク".to_string()), + ("グ".to_string(),"グ".to_string()), + ("ケ".to_string(),"ケ".to_string()), + ("ゲ".to_string(),"ゲ".to_string()), + ("コ".to_string(),"コ".to_string()), + ("ゴ".to_string(),"ゴ".to_string()), + ("サ".to_string(),"サ".to_string()), + ("ザ".to_string(),"ザ".to_string()), + ("シ".to_string(),"シ".to_string()), + ("ジ".to_string(),"ジ".to_string()), + ("ス".to_string(),"ス".to_string()), + ("ズ".to_string(),"ズ".to_string()), + ("セ".to_string(),"セ".to_string()), + ("ゼ".to_string(),"ゼ".to_string()), + ("ソ".to_string(),"ソ".to_string()), + ("ゾ".to_string(),"ゾ".to_string()), + ("タ".to_string(),"タ".to_string()), + ("ダ".to_string(),"ダ".to_string()), + ("チ".to_string(),"チ".to_string()), + ("ヂ".to_string(),"ヂ".to_string()), + ("ッ".to_string(),"ッ".to_string()), + ("ツ".to_string(),"ツ".to_string()), + ("ヅ".to_string(),"ヅ".to_string()), + ("テ".to_string(),"テ".to_string()), + ("デ".to_string(),"デ".to_string()), + ("ト".to_string(),"ト".to_string()), + ("ド".to_string(),"ド".to_string()), + ("ナ".to_string(),"ナ".to_string()), + ("ニ".to_string(),"ニ".to_string()), + ("ヌ".to_string(),"ヌ".to_string()), + ("ネ".to_string(),"ネ".to_string()), + ("ノ".to_string(),"ノ".to_string()), + ("ハ".to_string(),"ハ".to_string()), + ("バ".to_string(),"バ".to_string()), + ("パ".to_string(),"パ".to_string()), + ("ヒ".to_string(),"ヒ".to_string()), + ("ビ".to_string(),"ビ".to_string()), + ("ピ".to_string(),"ピ".to_string()), + ("フ".to_string(),"フ".to_string()), + ("ブ".to_string(),"ブ".to_string()), + ("プ".to_string(),"プ".to_string()), + ("ヘ".to_string(),"ヘ".to_string()), + ("ベ".to_string(),"ベ".to_string()), + ("ペ".to_string(),"ペ".to_string()), + ("ホ".to_string(),"ホ".to_string()), + ("ボ".to_string(),"ボ".to_string()), + ("ポ".to_string(),"ポ".to_string()), + ("マ".to_string(),"マ".to_string()), + ("ミ".to_string(),"ミ".to_string()), + ("ム".to_string(),"ム".to_string()), + ("メ".to_string(),"メ".to_string()), + ("モ".to_string(),"モ".to_string()), + ("ャ".to_string(),"ャ".to_string()), + ("ヤ".to_string(),"ヤ".to_string()), + ("ュ".to_string(),"ュ".to_string()), + ("ユ".to_string(),"ユ".to_string()), + ("ョ".to_string(),"ョ".to_string()), + ("ヨ".to_string(),"ヨ".to_string()), + ("ラ".to_string(),"ラ".to_string()), + ("リ".to_string(),"リ".to_string()), + ("ル".to_string(),"ル".to_string()), + ("レ".to_string(),"レ".to_string()), + ("ロ".to_string(),"ロ".to_string()), + ("ワ".to_string(),"ワ".to_string()), + ("ヲ".to_string(),"ヲ".to_string()), + ("ン".to_string(),"ン".to_string()), + ("ー".to_string(),"-".to_string()), + ("ヮ".to_string(),"ヮ".to_string()), + ("ヰ".to_string(),"ヰ".to_string()), + ("ヱ".to_string(),"ヱ".to_string()), + ("ヵ".to_string(),"ヵ".to_string()), + ("ヶ".to_string(),"ヶ".to_string()), + ("ヴ".to_string(),"ヴ".to_string()), + ("ヽ".to_string(),"ヽ".to_string()), + ("ヾ".to_string(),"ヾ".to_string()), + ("・".to_string(),"・".to_string()), + ("「".to_string(),"「".to_string()), + ("」".to_string(),"」".to_string()), + ("。".to_string(),"。".to_string()), + ("、".to_string(),"、".to_string()), + ("!".to_string(),"!".to_string()), + (""".to_string(),"\"".to_string()), + ("#".to_string(),"#".to_string()), + ("$".to_string(),"$".to_string()), + ("%".to_string(),"%".to_string()), + ("&".to_string(),"&".to_string()), + ("'".to_string(),"'".to_string()), + ("(".to_string(),"(".to_string()), + (")".to_string(),")".to_string()), + ("*".to_string(),"*".to_string()), + ("+".to_string(),"+".to_string()), + (",".to_string(),",".to_string()), + (".".to_string(),".".to_string()), + ("/".to_string(),"/".to_string()), + (":".to_string(),":".to_string()), + (";".to_string(),";".to_string()), + ("<".to_string(),"<".to_string()), + ("=".to_string(),"=".to_string()), + (">".to_string(),">".to_string()), + ("?".to_string(),"?".to_string()), + ("@".to_string(),"@".to_string()), + ("A".to_string(),"A".to_string()), + ("B".to_string(),"B".to_string()), + ("C".to_string(),"C".to_string()), + ("D".to_string(),"D".to_string()), + ("E".to_string(),"E".to_string()), + ("F".to_string(),"F".to_string()), + ("G".to_string(),"G".to_string()), + ("H".to_string(),"H".to_string()), + ("I".to_string(),"I".to_string()), + ("J".to_string(),"J".to_string()), + ("K".to_string(),"K".to_string()), + ("L".to_string(),"L".to_string()), + ("M".to_string(),"M".to_string()), + ("N".to_string(),"N".to_string()), + ("O".to_string(),"O".to_string()), + ("P".to_string(),"P".to_string()), + ("Q".to_string(),"Q".to_string()), + ("R".to_string(),"R".to_string()), + ("S".to_string(),"S".to_string()), + ("T".to_string(),"T".to_string()), + ("U".to_string(),"U".to_string()), + ("V".to_string(),"V".to_string()), + ("W".to_string(),"W".to_string()), + ("X".to_string(),"X".to_string()), + ("Y".to_string(),"Y".to_string()), + ("Z".to_string(),"Z".to_string()), + ("[".to_string(),"[".to_string()), + ("\".to_string(),"\\".to_string()), + ("]".to_string(),"]".to_string()), + ("^".to_string(),"^".to_string()), + ("_".to_string(),"_".to_string()), + ("`".to_string(),"`".to_string()), + ("a".to_string(),"a".to_string()), + ("b".to_string(),"b".to_string()), + ("c".to_string(),"c".to_string()), + ("d".to_string(),"d".to_string()), + ("e".to_string(),"e".to_string()), + ("f".to_string(),"f".to_string()), + ("g".to_string(),"g".to_string()), + ("h".to_string(),"h".to_string()), + ("i".to_string(),"i".to_string()), + ("j".to_string(),"j".to_string()), + ("k".to_string(),"k".to_string()), + ("l".to_string(),"l".to_string()), + ("m".to_string(),"m".to_string()), + ("n".to_string(),"n".to_string()), + ("o".to_string(),"o".to_string()), + ("p".to_string(),"p".to_string()), + ("q".to_string(),"q".to_string()), + ("r".to_string(),"r".to_string()), + ("s".to_string(),"s".to_string()), + ("t".to_string(),"t".to_string()), + ("u".to_string(),"u".to_string()), + ("v".to_string(),"v".to_string()), + ("w".to_string(),"w".to_string()), + ("x".to_string(),"x".to_string()), + ("y".to_string(),"y".to_string()), + ("z".to_string(),"z".to_string()), + ("{".to_string(),"{".to_string()), + ("|".to_string(),"|".to_string()), + ("}".to_string(),"}".to_string()), + ("~".to_string(),"~".to_string()), + (" ".to_string()," ".to_string()), + ("0".to_string(),"0".to_string()), + ("1".to_string(),"1".to_string()), + ("2".to_string(),"2".to_string()), + ("3".to_string(),"3".to_string()), + ("4".to_string(),"4".to_string()), + ("5".to_string(),"5".to_string()), + ("6".to_string(),"6".to_string()), + ("7".to_string(),"7".to_string()), + ("8".to_string(),"8".to_string()), + ("9".to_string(),"9".to_string()), + ("ぁ".to_string(),"ァ".to_string()), + ("あ".to_string(),"ア".to_string()), + ("ぃ".to_string(),"ィ".to_string()), + ("い".to_string(),"イ".to_string()), + ("ぅ".to_string(),"ゥ".to_string()), + ("う".to_string(),"ウ".to_string()), + ("ぇ".to_string(),"ェ".to_string()), + ("え".to_string(),"エ".to_string()), + ("ぉ".to_string(),"ォ".to_string()), + ("お".to_string(),"オ".to_string()), + ("か".to_string(),"カ".to_string()), + ("が".to_string(),"ガ".to_string()), + ("き".to_string(),"キ".to_string()), + ("ぎ".to_string(),"ギ".to_string()), + ("く".to_string(),"ク".to_string()), + ("ぐ".to_string(),"グ".to_string()), + ("け".to_string(),"ケ".to_string()), + ("げ".to_string(),"ゲ".to_string()), + ("こ".to_string(),"コ".to_string()), + ("ご".to_string(),"ゴ".to_string()), + ("さ".to_string(),"サ".to_string()), + ("ざ".to_string(),"ザ".to_string()), + ("し".to_string(),"シ".to_string()), + ("じ".to_string(),"ジ".to_string()), + ("す".to_string(),"ス".to_string()), + ("ず".to_string(),"ズ".to_string()), + ("せ".to_string(),"セ".to_string()), + ("ぜ".to_string(),"ゼ".to_string()), + ("そ".to_string(),"ソ".to_string()), + ("ぞ".to_string(),"ゾ".to_string()), + ("た".to_string(),"タ".to_string()), + ("だ".to_string(),"ダ".to_string()), + ("ち".to_string(),"チ".to_string()), + ("ぢ".to_string(),"ヂ".to_string()), + ("っ".to_string(),"ッ".to_string()), + ("つ".to_string(),"ツ".to_string()), + ("づ".to_string(),"ヅ".to_string()), + ("て".to_string(),"テ".to_string()), + ("で".to_string(),"デ".to_string()), + ("と".to_string(),"ト".to_string()), + ("ど".to_string(),"ド".to_string()), + ("な".to_string(),"ナ".to_string()), + ("に".to_string(),"ニ".to_string()), + ("ぬ".to_string(),"ヌ".to_string()), + ("ね".to_string(),"ネ".to_string()), + ("の".to_string(),"ノ".to_string()), + ("は".to_string(),"ハ".to_string()), + ("ば".to_string(),"バ".to_string()), + ("ぱ".to_string(),"パ".to_string()), + ("ひ".to_string(),"ヒ".to_string()), + ("び".to_string(),"ビ".to_string()), + ("ぴ".to_string(),"ピ".to_string()), + ("ふ".to_string(),"フ".to_string()), + ("ぶ".to_string(),"ブ".to_string()), + ("ぷ".to_string(),"プ".to_string()), + ("へ".to_string(),"ヘ".to_string()), + ("べ".to_string(),"ベ".to_string()), + ("ぺ".to_string(),"ペ".to_string()), + ("ほ".to_string(),"ホ".to_string()), + ("ぼ".to_string(),"ボ".to_string()), + ("ぽ".to_string(),"ポ".to_string()), + ("ま".to_string(),"マ".to_string()), + ("み".to_string(),"ミ".to_string()), + ("む".to_string(),"ム".to_string()), + ("め".to_string(),"メ".to_string()), + ("も".to_string(),"モ".to_string()), + ("ゃ".to_string(),"ャ".to_string()), + ("や".to_string(),"ヤ".to_string()), + ("ゅ".to_string(),"ュ".to_string()), + ("ゆ".to_string(),"ユ".to_string()), + ("ょ".to_string(),"ョ".to_string()), + ("よ".to_string(),"ヨ".to_string()), + ("ら".to_string(),"ラ".to_string()), + ("り".to_string(),"リ".to_string()), + ("る".to_string(),"ル".to_string()), + ("れ".to_string(),"レ".to_string()), + ("ろ".to_string(),"ロ".to_string()), + ("わ".to_string(),"ワ".to_string()), + ("を".to_string(),"ヲ".to_string()), + ("ん".to_string(),"ン".to_string()), + ("ゎ".to_string(),"ヮ".to_string()), + ("ゐ".to_string(),"ヰ".to_string()), + ("ゑ".to_string(),"ヱ".to_string()), + ("ゕ".to_string(),"ヵ".to_string()), + ("ゖ".to_string(),"ヶ".to_string()), + ("ゔ".to_string(),"ヴ".to_string()), + ("ゝ".to_string(),"ヽ".to_string()), + ("ゞ".to_string(),"ヾ".to_string()), + ]); -pub const ALLOWED_HW_KANA: Lazy> = Lazy::new(|| {MAPPINGS_HW.values().cloned().collect()}); + pub static ref ALLOWED_HW_KANA: Vec = MAPPINGS_HW.values().cloned().collect(); +} diff --git a/minidisc-rs/src/netmd/query_utils.rs b/minidisc-rs/src/netmd/query_utils.rs index 611ab51..d3a8b20 100644 --- a/minidisc-rs/src/netmd/query_utils.rs +++ b/minidisc-rs/src/netmd/query_utils.rs @@ -1,26 +1,23 @@ use crate::netmd::utils; -use once_cell::sync::Lazy; +use lazy_static::lazy_static; use std::collections::hash_map::HashMap; use std::error::Error; -/** - %b, w, d, q - explained above (can have endiannes overriden by '>' and '<' operators, f. ex. %>d %> = Lazy::new(|| { - HashMap::from([ +lazy_static!{ + /// %b, w, d, q - explained above (can have endiannes overriden by '>' and '<' operators, f. ex. %>d % = HashMap::from([ ('b', 1), // byte ('w', 2), // word ('d', 4), // doubleword ('q', 8), // quadword - ]) -}); + ]); +} const DEBUG: bool = false; @@ -108,7 +105,7 @@ pub fn format_query( result.push(0); } } - character if character == '*' => { + '*' => { let mut array_value = arg_stack.next().unwrap().to_vec().unwrap(); result.append(&mut array_value); } @@ -215,17 +212,17 @@ pub fn scan_query( character if character == '*' || character == '#' => { let mut result_buffer: Vec = Vec::new(); let temp_stack = input_stack.clone(); - for entry in temp_stack.take(initial_length as usize) { + for entry in temp_stack.take(initial_length) { result_buffer.push(entry); input_stack.next(); } result.push(QueryValue::Array(result_buffer)); } - character if character == 'B' => { + 'B' => { let v = input_stack.next().unwrap(); result.push(QueryValue::Number(utils::bcd_to_int(v as i32) as i64)); } - character if character == 'W' => { + 'W' => { let v = (input_stack.next().unwrap() as i32) << 8 | input_stack.next().unwrap() as i32; result.push(QueryValue::Number(utils::bcd_to_int(v) as i64)); diff --git a/minidisc-rs/src/netmd/utils.rs b/minidisc-rs/src/netmd/utils.rs index cd88adc..3bb1a95 100644 --- a/minidisc-rs/src/netmd/utils.rs +++ b/minidisc-rs/src/netmd/utils.rs @@ -2,7 +2,7 @@ use crate::netmd::mappings::{ALLOWED_HW_KANA, MAPPINGS_DE, MAPPINGS_HW, MAPPINGS use diacritics; use encoding_rs::SHIFT_JIS; use regex::Regex; -use std::collections::hash_map::HashMap; +use std::{collections::hash_map::HashMap, error::Error, vec::IntoIter}; use unicode_normalization::UnicodeNormalization; extern crate kana; @@ -14,7 +14,7 @@ pub fn bcd_to_int(mut bcd: i32) -> i32 { while bcd != 0 { let nibble_value = bcd & 0xf; - bcd = bcd >> 4; + bcd >>= 4; value += nibble_value * i32::pow(10, nibble); nibble += 1; } @@ -36,7 +36,7 @@ pub fn int_to_bcd(mut value: i32) -> i32 { bcd } -pub fn half_width_to_full_width_range(range: &String) -> String { +pub fn half_width_to_full_width_range(range: &str) -> String { let mappings: HashMap = HashMap::from([ ('0', '0'), ('1', '1'), @@ -60,21 +60,15 @@ pub fn half_width_to_full_width_range(range: &String) -> String { } pub fn get_bytes( - iterator: &mut std::vec::IntoIter, -) -> Result<[u8; S], Box> { - let mut bytes = [0; S]; - - for i in 0..S { - bytes[i] = match iterator.next() { - Some(byte) => byte, - None => return Err("Could not retrieve byte from file".into()), - }; - } + iterator: &mut IntoIter, +) -> Result<[u8; S], Box> { + let byte_vec: Vec = iterator.take(S).collect(); + let bytes: [u8; S] = byte_vec.try_into().unwrap(); Ok(bytes) } -pub fn length_after_encoding_to_jis(string: &String) -> usize { +pub fn length_after_encoding_to_jis(string: &str) -> usize { let new_string = SHIFT_JIS.encode(string); new_string.0.len() @@ -83,11 +77,7 @@ pub fn length_after_encoding_to_jis(string: &String) -> usize { pub fn validate_shift_jis(sjis_string: Vec) -> bool { let (_, _, had_errors) = SHIFT_JIS.decode(&sjis_string); - if had_errors { - true - } else { - false - } + had_errors } fn check(string: String) -> Option { @@ -124,11 +114,11 @@ pub fn sanitize_half_width_title(mut title: String) -> Vec { return agressive_sanitize_title(&title).into(); } - return sjis_string.into(); + sjis_string.into() } // TODO: This function is bad, probably should do the string sanitization in the frontend -pub fn sanitize_full_width_title(title: &String, just_remap: bool) -> Vec { +pub fn sanitize_full_width_title(title: &str, just_remap: bool) -> Vec { let new_title: String = title .chars() .map(|character| { @@ -161,13 +151,13 @@ pub fn sanitize_full_width_title(title: &String, just_remap: bool) -> Vec { let sjis_string = SHIFT_JIS.encode(&new_title).0; if validate_shift_jis(sjis_string.clone().into()) { - return agressive_sanitize_title(&title).into(); + return agressive_sanitize_title(title).into(); } - return sjis_string.into(); + sjis_string.into() } -pub fn agressive_sanitize_title(title: &String) -> String { +pub fn agressive_sanitize_title(title: &str) -> String { let re = Regex::new(r"[^\x00-\x7F]").unwrap(); re.replace_all( &diacritics::remove_diacritics(title)