From c67663141f3ff412c84353d541c3ad1a8244c5e9 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Mon, 24 Aug 2026 11:35:37 +0300 Subject: [PATCH] Full split of lang.rs --- src/app.rs | 3 ++- src/core/deck.rs | 7 +++--- src/core/srs.rs | 2 -- src/{lang.rs => data.rs} | 39 ++++--------------------------- src/data/entities.rs | 42 ++++++++++++++++++++++++++++++++++ src/data_provider/card_sets.rs | 1 - src/data_provider/history.rs | 20 ++++++---------- src/data_provider/words.rs | 2 +- src/main.rs | 3 ++- src/navigation.rs | 2 +- src/pages/dictionary.rs | 11 ++++----- src/pages/dictionary_quiz.rs | 2 +- src/pages/history.rs | 7 +++--- src/pages/import.rs | 2 +- src/pages/repetition.rs | 12 +++++----- src/pages/repetitions.rs | 2 +- src/pages/word.rs | 2 +- 17 files changed, 81 insertions(+), 78 deletions(-) rename src/{lang.rs => data.rs} (68%) create mode 100644 src/data/entities.rs diff --git a/src/app.rs b/src/app.rs index 6ad52ca..a37421b 100644 --- a/src/app.rs +++ b/src/app.rs @@ -12,7 +12,8 @@ use crate::data_provider::card_sets::load_sets; use crate::data_provider::settings::get_setting; use crate::data_provider::sqlite::default_connection; use crate::data_provider::words::{load_word_groups, load_words}; -use crate::lang::{Id, WordData, WordGroup}; +use crate::data::entities::{ WordData, WordGroup}; +use crate::data::Id; use crate::navigation::{AppSettings, RootMessage, ScreenState}; use crate::navigation::RootMessage::Keyboard; pub const USER_FONT: Font = Font::with_name("Noto Sans JP"); diff --git a/src/core/deck.rs b/src/core/deck.rs index 8b47521..e6b6f96 100644 --- a/src/core/deck.rs +++ b/src/core/deck.rs @@ -10,8 +10,9 @@ use rhai::{Engine, Scope}; use crate::app::AppState; use crate::core::srs::{OrderMode, OrderModule, RandomSRSModule, SRSModule, SemiRandomSRSModule, WordOpenMode, WorstWordsSRSModule, FADE_PER_DAY, MAX_SCORE}; use crate::data_provider::card_stats::{load_stats_of_deck, update_stat_score}; -use crate::data_provider::history::{push_note, HistoryItem}; -use crate::lang::{ Id, WordData}; +use crate::data_provider::history::{push_note}; +use crate::data::entities::*; +use crate::data::Id; #[derive(Clone)] pub struct DeckSettings { @@ -21,7 +22,6 @@ pub struct DeckSettings { pub backward: String, pub filter: String, pub count: Option, - pub worst_words_list: Option>, pub open_mode: OrderMode, } impl DeckSettings { @@ -33,7 +33,6 @@ impl DeckSettings { backward: "".to_string(), filter: "true".to_string(), count: None, - worst_words_list: None, open_mode: OrderMode::Default, } } diff --git a/src/core/srs.rs b/src/core/srs.rs index 5f03fc8..2b977f4 100644 --- a/src/core/srs.rs +++ b/src/core/srs.rs @@ -3,8 +3,6 @@ use rand::distr::weighted::WeightedIndex; use rand::prelude::ThreadRng; use rand::prelude::{Distribution, SliceRandom}; use rand::rng; -use rayon::iter::IndexedParallelIterator; -use rayon::iter::ParallelIterator; const MAX_HISTORY_LEN: usize = 20; const MAX_HISTORY_LEN_PART: f32 = 0.33; diff --git a/src/lang.rs b/src/data.rs similarity index 68% rename from src/lang.rs rename to src/data.rs index e3724b5..f8c8120 100644 --- a/src/lang.rs +++ b/src/data.rs @@ -1,10 +1,10 @@ -use rusqlite::types::{FromSql, FromSqlError, FromSqlResult, ToSqlOutput, ValueRef}; -use rusqlite::ToSql; -use std::cmp::PartialEq; -use std::collections::HashMap; +pub mod entities; + use std::fmt::{Display, Formatter}; use std::num::ParseIntError; use std::str::FromStr; +use rusqlite::ToSql; +use rusqlite::types::{FromSql, FromSqlError, FromSqlResult, ToSqlOutput, ValueRef}; #[derive(Clone, PartialEq, Eq, Debug, Hash, Copy, Ord, PartialOrd)] pub struct Id(pub(crate) u32); @@ -59,33 +59,4 @@ impl Id { pub(crate) fn is_valid(self) -> bool { self.0 != 0 } -} - -#[derive(Clone, Debug)] -pub struct WordData { - pub id: Id, - pub key: String, - pub value: String, - pub tags: String, - pub additional: HashMap, - pub group_id: Id, -} -#[derive(Clone)] -pub struct WordGroup { - pub id: Id, - pub name: String, -} - - -impl WordData { - pub fn new() -> Self { - Self { - id: INVALID_ID, - key: String::new(), - value: String::new(), - tags: String::new(), - additional: Default::default(), - group_id: 1.into(), - } - } -} +} \ No newline at end of file diff --git a/src/data/entities.rs b/src/data/entities.rs new file mode 100644 index 0000000..0fa6c97 --- /dev/null +++ b/src/data/entities.rs @@ -0,0 +1,42 @@ +use std::collections::HashMap; +use chrono::{DateTime, Utc}; +use crate::core::srs::WordOpenMode; +use crate::data::{Id, INVALID_ID}; + +#[derive(Clone, Debug)] +pub struct WordData { + pub id: Id, + pub key: String, + pub value: String, + pub tags: String, + pub additional: HashMap, + pub group_id: Id, +} +#[derive(Clone)] +pub struct WordGroup { + pub id: Id, + pub name: String, +} + + +impl WordData { + pub fn new() -> Self { + Self { + id: INVALID_ID, + key: String::new(), + value: String::new(), + tags: String::new(), + additional: Default::default(), + group_id: 1.into(), + } + } +} + +#[derive(Clone)] +pub struct HistoryItem { + pub timestamp: DateTime, + pub word_id: Id, + pub mode: WordOpenMode, + pub before: u8, + pub after: u8, +} \ No newline at end of file diff --git a/src/data_provider/card_sets.rs b/src/data_provider/card_sets.rs index 341bdb5..73d8a78 100644 --- a/src/data_provider/card_sets.rs +++ b/src/data_provider/card_sets.rs @@ -16,7 +16,6 @@ pub fn load_sets(connection: &Connection) -> Vec { backward: row.get(3)?, filter: row.get(4)?, count: None, - worst_words_list: None, open_mode: OrderMode::Default, }) }) diff --git a/src/data_provider/history.rs b/src/data_provider/history.rs index 880dacf..ead134b 100644 --- a/src/data_provider/history.rs +++ b/src/data_provider/history.rs @@ -1,13 +1,14 @@ +use crate::core::srs::WordOpenMode; +use crate::data::entities::HistoryItem; +use crate::data::Id; use crate::fs::*; -use crate::lang::{Id}; -use chrono::{DateTime, Utc}; +use crate::notification::NotificationData; +use crate::notification::NotificationData::PermissionDenied; +use chrono::DateTime; use std::fs::{File, OpenOptions}; use std::io::Write; use std::io::{BufRead, BufReader}; use std::path::PathBuf; -use crate::core::srs::WordOpenMode; -use crate::notification::NotificationData; -use crate::notification::NotificationData::PermissionDenied; pub fn get_history_of_set(id: Id) -> Result, NotificationData> { let app_dir = history_dir()?; @@ -84,11 +85,4 @@ pub fn push_note(set_id: Id, item: HistoryItem) -> Result<(), NotificationData> Ok(()) } -#[derive(Clone)] -pub struct HistoryItem { - pub timestamp: DateTime, - pub word_id: Id, - pub mode: WordOpenMode, - pub before: u8, - pub after: u8, -} + diff --git a/src/data_provider/words.rs b/src/data_provider/words.rs index a02ea89..68aec73 100644 --- a/src/data_provider/words.rs +++ b/src/data_provider/words.rs @@ -1,6 +1,6 @@ -use crate::lang::{WordData, WordGroup}; use rusqlite::{Connection, params}; use std::collections::HashMap; +use crate::data::entities::{WordData, WordGroup}; pub fn add_word(word: &mut WordData, connection: &Connection) { let index : u32 = connection diff --git a/src/main.rs b/src/main.rs index b608b55..4c9bbf2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,12 +2,13 @@ mod data_provider; pub mod notification; pub mod app; -mod lang; mod styling; mod pages; mod navigation; mod fs; mod core; +mod data; + use crate::app::start; use mimalloc::MiMalloc; diff --git a/src/navigation.rs b/src/navigation.rs index 61862c9..66f3cfe 100644 --- a/src/navigation.rs +++ b/src/navigation.rs @@ -5,7 +5,6 @@ use crate::data_provider::web_api::{ get_local_version, get_web_version, load_data, set_local_version, }; use crate::fs::*; -use crate::lang::Id; use crate::message_navigation; use crate::navigation::Page::*; use crate::navigation::RootMessage::{ @@ -41,6 +40,7 @@ use parking_lot::Mutex; use rusqlite::Connection; use std::sync::Arc; use std::time::Instant; +use crate::data::Id; impl Default for ScreenState { fn default() -> Self { diff --git a/src/pages/dictionary.rs b/src/pages/dictionary.rs index b73e62d..cc808dc 100644 --- a/src/pages/dictionary.rs +++ b/src/pages/dictionary.rs @@ -1,8 +1,8 @@ +use crate::data::Id; use crate::data_provider::words::{delete_group, delete_word, update_group, update_word}; use crate::pages::dictionary::DictionaryMessage::*; use crate::pages::dictionary_quiz::DictionaryQuizState; use crate::pages::import::ImportState; -use crate::lang::{WordData, WordGroup}; use crate::navigation::Page::{Import, Word}; use crate::navigation::{NavigatedPage, Page, RootMessage}; use crate::styling::*; @@ -19,13 +19,12 @@ use iced::{Border, Color, Shadow, Task}; use iced_core::Length::Fill; use parking_lot::Mutex; use rand::random_range; -use std::fs; use std::ops::Add; -use std::path::PathBuf; use std::sync::Arc; use std::time::{Duration, Instant}; use log::info; use crate::app::AppState; +use crate::data::entities::{WordData, WordGroup}; #[derive(Clone)] pub struct DictionaryState { @@ -529,7 +528,7 @@ impl DictionaryState { }); } - fn update_words_include(&mut self, group_id: crate::lang::Id) { + fn update_words_include(&mut self, group_id: Id) { let include_tags = self .tag_map .iter() @@ -619,14 +618,12 @@ pub fn split_with_coma(ts: &str) -> Vec { .collect::>() } - - #[derive(Hash, PartialEq, Eq)] struct WordLineState { is_included: bool, key: String, value: String, tags: String, - id: crate::lang::Id, + id: Id, index: usize, } diff --git a/src/pages/dictionary_quiz.rs b/src/pages/dictionary_quiz.rs index 2efc286..0f48535 100644 --- a/src/pages/dictionary_quiz.rs +++ b/src/pages/dictionary_quiz.rs @@ -1,7 +1,6 @@ use crate::navigation::RootMessage; use crate::pages::dictionary::split_with_coma; use crate::pages::dictionary_quiz::DictionaryQuizMessage::*; -use crate::lang::WordData; use crate::navigation::Page::PreviousPage; use crate::navigation::*; use crate::pages::quiz::Score; @@ -12,6 +11,7 @@ use iced::widget::container::Style; use iced::widget::{Row, button, container, row, space, text, text_input}; use iced::{Border, Element, Fill, Task, Theme, alignment}; use rand::prelude::SliceRandom; +use crate::data::entities::WordData; #[derive(Debug, Clone)] pub struct DictionaryQuizState { diff --git a/src/pages/history.rs b/src/pages/history.rs index 15dfcef..f17bb53 100644 --- a/src/pages/history.rs +++ b/src/pages/history.rs @@ -1,5 +1,4 @@ -use crate::data_provider::history::{get_history_of_set, HistoryItem}; -use crate::lang::{WordData, INVALID_ID}; +use crate::data_provider::history::{get_history_of_set}; use crate::navigation::*; use crate::styling::*; use chrono::Local; @@ -11,6 +10,8 @@ use parking_lot::Mutex; use std::sync::Arc; use HistoryMessage::Back; use crate::app::AppState; +use crate::data::entities::{HistoryItem, WordData}; +use crate::data::INVALID_ID; #[derive(Clone)] pub struct HistoryState { @@ -47,7 +48,7 @@ impl NavigatedPage for HistoryState { } impl HistoryState { - pub fn new(id: crate::lang::Id, state: Arc>) -> Self { + pub fn new(id: crate::data::Id, state: Arc>) -> Self { let state = state.lock(); let history = get_history_of_set(id).unwrap_or_default(); let words = history diff --git a/src/pages/import.rs b/src/pages/import.rs index 0b84a85..71db597 100644 --- a/src/pages/import.rs +++ b/src/pages/import.rs @@ -1,7 +1,7 @@ use crate::data_provider::import::{ImportData, ImportGroup, get_words_of_group, load_groups}; use crate::data_provider::words::{add_group, add_words}; use crate::pages::import::ImportMessage::*; -use crate::lang::{WordData, WordGroup}; +use crate::data::entities::{WordData, WordGroup}; use crate::navigation::{NavigatedPage, Page, RootMessage}; use crate::notification::NotificationData::OpenFileError; use crate::notification::{NotificationData, NotificationRequest}; diff --git a/src/pages/repetition.rs b/src/pages/repetition.rs index a5ab536..dedf827 100644 --- a/src/pages/repetition.rs +++ b/src/pages/repetition.rs @@ -1,7 +1,9 @@ use crate::app::AppState; +use crate::core::deck::{CardStatistics, DeckData, DeckSettings}; +use crate::core::srs::WordOpenMode; +use crate::data::entities::WordData; +use crate::data::Id; use crate::data_provider::voice::get_voice; -use crate::lang::Id; -use crate::lang::{ WordData}; use crate::navigation::Page::PreviousPage; use crate::navigation::{KeyPressedPage, NavigatedPage, Page, RootMessage}; use crate::notification::{NotificationData, NotificationRequest}; @@ -10,15 +12,13 @@ use chrono::Local; use iced::alignment::Horizontal::Center; use iced::keyboard::key::Physical::Code; use iced::widget::text::Style; -use iced::widget::{Column, button, column, container, row, rule, space, text, tooltip}; -use iced::{Element, Fill, Task, Theme, alignment, keyboard}; +use iced::widget::{button, column, container, row, rule, space, text, tooltip, Column}; +use iced::{alignment, keyboard, Element, Fill, Task, Theme}; use parking_lot::Mutex; use rodio::MixerDeviceSink; use std::collections::HashSet; use std::sync::Arc; use tokio::task::spawn_blocking; -use crate::core::deck::{CardStatistics, DeckData, DeckSettings}; -use crate::core::srs::{ WordOpenMode}; pub struct RepetitionState { state: Arc>, diff --git a/src/pages/repetitions.rs b/src/pages/repetitions.rs index 3e8381a..6ff139f 100644 --- a/src/pages/repetitions.rs +++ b/src/pages/repetitions.rs @@ -1,7 +1,6 @@ use crate::data_provider::card_sets::update_deck; use crate::data_provider::card_stats::{add_stat_list, load_stats_of_deck}; use crate::pages::history::HistoryState; -use crate::lang::{Id}; use crate::navigation::Page::{History, PreviousPage, Repetition, RepetitionSettings}; use crate::navigation::{NavigatedPage, Page, RootMessage}; use crate::pages::repetition::RepetitionState; @@ -27,6 +26,7 @@ use std::sync::Arc; use crate::app::AppState; use crate::core::deck::{CardStatistics, DeckSettings}; use crate::core::srs::{AppendMode, OrderMode}; +use crate::data::Id; #[derive(Clone)] pub struct RepetitionsState { diff --git a/src/pages/word.rs b/src/pages/word.rs index 7d9778a..d7e6a13 100644 --- a/src/pages/word.rs +++ b/src/pages/word.rs @@ -1,5 +1,5 @@ use crate::data_provider::words::{delete_word, update_word}; -use crate::lang::WordData; +use crate::data::entities::WordData; use crate::navigation::Page::PreviousPage; use crate::navigation::{NavigatedPage, Page, RootMessage}; use crate::styling::*;