full macros navigation

This commit is contained in:
2026-02-10 12:12:16 +03:00
parent 4868156ca7
commit fe75d7de23
4 changed files with 482 additions and 255 deletions
+208
View File
@@ -0,0 +1,208 @@
use rand::RngExt;
#[derive(Clone, Debug)]
pub struct KanaSet {
name: String,
pub(crate) chars_type: KanaType,
pub(crate) dictionary: Vec<Vec<(String, String)>>,
pub(crate) include_map: [bool; 10],
}
#[derive(Clone, Debug)]
pub enum KanaType {
Hiragana,
Katakana,
}
impl KanaSet {
pub fn hiragana() -> Self {
Self {
name: "Хирагана".to_string(),
chars_type: KanaType::Hiragana,
dictionary: vec![
vec![
(String::from(""), String::from("a")),
(String::from(""), String::from("i")),
(String::from(""), String::from("u")),
(String::from(""), String::from("e")),
(String::from(""), String::from("o")),
],
vec![
(String::from(""), String::from("sa")),
(String::from(""), String::from("shi")),
(String::from(""), String::from("su")),
(String::from(""), String::from("se")),
(String::from(""), String::from("so")),
],
vec![
(String::from(""), String::from("ka")),
(String::from(""), String::from("ki")),
(String::from(""), String::from("ku")),
(String::from(""), String::from("ke")),
(String::from(""), String::from("ko")),
],
// Ряд «та» (たちつてと)
vec![
(String::from(""), String::from("ta")),
(String::from(""), String::from("chi")),
(String::from(""), String::from("tsu")),
(String::from(""), String::from("te")),
(String::from(""), String::from("to")),
],
// Ряд «на» (なにぬねの)
vec![
(String::from(""), String::from("na")),
(String::from(""), String::from("ni")),
(String::from(""), String::from("nu")),
(String::from(""), String::from("ne")),
(String::from(""), String::from("no")),
],
// Ряд «ха» (はひふへほ)
vec![
(String::from(""), String::from("ha")),
(String::from(""), String::from("hi")),
(String::from(""), String::from("fu")),
(String::from(""), String::from("he")),
(String::from(""), String::from("ho")),
],
// Ряд «ма» (まみむめも)
vec![
(String::from(""), String::from("ma")),
(String::from(""), String::from("mi")),
(String::from(""), String::from("mu")),
(String::from(""), String::from("me")),
(String::from(""), String::from("mo")),
],
// Ряд «я» (やゆよ) — только 3 символа
vec![
(String::from(""), String::from("ya")),
(String::from(""), String::from("yu")),
(String::from(""), String::from("yo")),
],
// Ряд «ра» (らりるれろ)
vec![
(String::from(""), String::from("ra")),
(String::from(""), String::from("ri")),
(String::from(""), String::from("ru")),
(String::from(""), String::from("re")),
(String::from(""), String::from("ro")),
],
vec![
(String::from(""), String::from("wa")),
(String::from(""), String::from("wo")),
(String::from(""), String::from("n")),
],
],
include_map: [true; 10],
}
}
pub fn katakana() -> Self {
Self {
name: "Катакана".to_string(),
chars_type: KanaType::Katakana,
dictionary: vec![
vec![
(String::from(""), String::from("a")),
(String::from(""), String::from("i")),
(String::from(""), String::from("u")),
(String::from(""), String::from("e")),
(String::from(""), String::from("o")),
],
vec![
(String::from(""), String::from("sa")),
(String::from(""), String::from("shi")),
(String::from(""), String::from("su")),
(String::from(""), String::from("se")),
(String::from(""), String::from("so")),
],
vec![
(String::from(""), String::from("ka")),
(String::from(""), String::from("ki")),
(String::from(""), String::from("ku")),
(String::from(""), String::from("ke")),
(String::from(""), String::from("ko")),
],
// Ряд «та» (タチツテト)
vec![
(String::from(""), String::from("ta")),
(String::from(""), String::from("chi")),
(String::from(""), String::from("tsu")),
(String::from(""), String::from("te")),
(String::from(""), String::from("to")),
],
// Ряд «на» (ナニヌネノ)
vec![
(String::from(""), String::from("na")),
(String::from(""), String::from("ni")),
(String::from(""), String::from("nu")),
(String::from(""), String::from("ne")),
(String::from(""), String::from("no")),
],
// Ряд «ха» (ハヒフヘホ)
vec![
(String::from(""), String::from("ha")),
(String::from(""), String::from("hi")),
(String::from(""), String::from("fu")),
(String::from(""), String::from("he")),
(String::from(""), String::from("ho")),
],
// Ряд «ма» (マミムメモ)
vec![
(String::from(""), String::from("ma")),
(String::from(""), String::from("mi")),
(String::from(""), String::from("mu")),
(String::from(""), String::from("me")),
(String::from(""), String::from("mo")),
],
// Ряд «я» (ヤユヨ) — только 3 символа
vec![
(String::from(""), String::from("ya")),
(String::from(""), String::from("yu")),
(String::from(""), String::from("yo")),
],
// Ряд «ра» (ラリルレロ)
vec![
(String::from(""), String::from("ra")),
(String::from(""), String::from("ri")),
(String::from(""), String::from("ru")),
(String::from(""), String::from("re")),
(String::from(""), String::from("ro")),
],
vec![
(String::from(""), String::from("wa")),
(String::from(""), String::from("wo")),
(String::from(""), String::from("n")),
],
],
include_map: [true; 10],
}
}
pub fn next(&mut self) -> (String, String) {
let mut current_set: Vec<(String, String)> = Vec::new();
for i in 0..10 {
if self.include_map[i] {
self.dictionary[i].iter().for_each(|v| {
current_set.push(v.clone());
});
}
}
let mut rand = rand::rng();
let index: u32 = rand.random();
current_set[index as usize % current_set.len()].clone()
}
}
impl Default for KanaSet {
fn default() -> Self {
KanaSet::hiragana()
}
}
impl PartialEq<Self> for KanaSet {
fn eq(&self, other: &Self) -> bool {
self.name == other.name
}
}