diff --git a/lib/src/common.rs b/lib/src/common.rs index b7854fc..52acd32 100644 --- a/lib/src/common.rs +++ b/lib/src/common.rs @@ -2,6 +2,5 @@ pub mod entities; pub mod errors; pub mod traits; -pub use self::traits::DictRepository; pub use self::traits::SystemDecoder; pub use self::traits::SystemEncoder; diff --git a/lib/src/common/entities.rs b/lib/src/common/entities.rs index ffb209b..5790cf0 100644 --- a/lib/src/common/entities.rs +++ b/lib/src/common/entities.rs @@ -2,7 +2,7 @@ use super::errors::CodecError; use serde::Serialize; use std::num::ParseIntError; use std::ops::Deref; -use std::{collections::HashMap, u64}; +use std::u64; /// A number encoded as a sequence of words #[derive(Debug, Clone, Serialize)] @@ -104,43 +104,3 @@ impl TryFrom for DecodedLength { } } } - -// --- Dictionary --- - -pub type DictEntryId = u64; - -#[derive(Debug, Clone, PartialEq)] -pub struct DictEntry { - pub id: Option, - pub text: String, - pub metadata: HashMap, -} - -impl DictEntry { - pub fn new(id: Option, text: String) -> Self { - DictEntry { - id, - text, - metadata: HashMap::new(), - } - } -} - -#[derive(Debug, Clone)] -pub struct Dict { - pub name: String, - pub entries: HashMap, -} - -impl Dict { - pub fn new(name: String) -> Self { - Dict { - name, - entries: HashMap::new(), - } - } - - pub fn add_entry(&mut self, entry: DictEntry) { - self.entries.insert(entry.id.unwrap(), entry); - } -} diff --git a/lib/src/common/traits.rs b/lib/src/common/traits.rs index 5322dee..85a68f6 100644 --- a/lib/src/common/traits.rs +++ b/lib/src/common/traits.rs @@ -1,8 +1,6 @@ -use futures::stream::BoxStream; - use crate::common::{ - entities::{DecodedValue, Dict, DictEntry, EncodedValue}, - errors::{CodecError, RepositoryError}, + entities::{DecodedValue, EncodedValue}, + errors::CodecError, }; pub trait SystemDecoder: Send + Sync { @@ -13,29 +11,3 @@ pub trait SystemEncoder: Send + Sync { fn initialize(&self) -> Result<(), CodecError>; fn encode(&self, word: &str) -> Result; } - -#[async_trait::async_trait] -pub trait DictRepository: Send + Sync { - fn use_dict(&mut self, name: &str); - async fn create_dict(&self) -> Result<(), RepositoryError>; - - /// "Upsert" logic: - /// - If entry exists (by text), update metadata. - /// - If not, insert new. - /// - IDs are handled by the Database. - async fn save_entries(&self, entries: &[DictEntry]) -> Result<(), RepositoryError>; - - /// Fetch a page of entries. - async fn fetch_many(&self, limit: usize, offset: usize) -> Result; - - /// Returns a cold stream that fetches strings in chunks. - /// The stream yields `Result, RepositoryError>`. - async fn stream_batches( - &self, - batch_size: usize, - ) -> Result, RepositoryError>>, RepositoryError>; -} - -pub trait DictSource { - fn next_entry(&mut self) -> Option>; -} diff --git a/lib/src/dictionary.rs b/lib/src/dictionary.rs index fedb896..5886316 100644 --- a/lib/src/dictionary.rs +++ b/lib/src/dictionary.rs @@ -1,6 +1,76 @@ mod dict_importer; mod infrastructure; +use futures::stream::BoxStream; + +use crate::common::errors::RepositoryError; + pub use self::dict_importer::DictImporter; pub use self::infrastructure::json_file_dict_source::JsonFileDictSource; pub use self::infrastructure::sqlite_dict_repository::SqliteDictRepository; + +use std::collections::HashMap; + +pub type DictEntryId = u64; + +#[derive(Debug, Clone, PartialEq)] +pub struct DictEntry { + pub id: Option, + pub text: String, + pub metadata: HashMap, +} + +impl DictEntry { + pub fn new(id: Option, text: String) -> Self { + DictEntry { + id, + text, + metadata: HashMap::new(), + } + } +} + +#[derive(Debug, Clone)] +pub struct Dict { + pub name: String, + pub entries: HashMap, +} + +impl Dict { + pub fn new(name: String) -> Self { + Dict { + name, + entries: HashMap::new(), + } + } + + pub fn add_entry(&mut self, entry: DictEntry) { + self.entries.insert(entry.id.unwrap(), entry); + } +} + +#[async_trait::async_trait] +pub trait DictRepository: Send + Sync { + fn use_dict(&mut self, name: &str); + async fn create_dict(&self) -> Result<(), RepositoryError>; + + /// "Upsert" logic: + /// - If entry exists (by text), update metadata. + /// - If not, insert new. + /// - IDs are handled by the Database. + async fn save_entries(&self, entries: &[DictEntry]) -> Result<(), RepositoryError>; + + /// Fetch a page of entries. + async fn fetch_many(&self, limit: usize, offset: usize) -> Result; + + /// Returns a cold stream that fetches strings in chunks. + /// The stream yields `Result, RepositoryError>`. + async fn stream_batches( + &self, + batch_size: usize, + ) -> Result, RepositoryError>>, RepositoryError>; +} + +pub trait DictSource { + fn next_entry(&mut self) -> Option>; +} diff --git a/lib/src/dictionary/dict_importer.rs b/lib/src/dictionary/dict_importer.rs index 5bec64b..db20b7d 100644 --- a/lib/src/dictionary/dict_importer.rs +++ b/lib/src/dictionary/dict_importer.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use crate::common::traits::{DictRepository, DictSource}; +use super::{DictRepository, DictSource}; pub struct DictImporter { repo: Arc, diff --git a/lib/src/dictionary/infrastructure/json_file_dict_source.rs b/lib/src/dictionary/infrastructure/json_file_dict_source.rs index b7b3dcd..356c14b 100644 --- a/lib/src/dictionary/infrastructure/json_file_dict_source.rs +++ b/lib/src/dictionary/infrastructure/json_file_dict_source.rs @@ -1,5 +1,5 @@ -use crate::common::entities::DictEntry; -use crate::common::traits::DictSource; +use crate::dictionary::DictEntry; +use crate::dictionary::DictSource; use serde::Deserialize; use std::collections::HashMap; use std::fs::File; diff --git a/lib/src/dictionary/infrastructure/sqlite_dict_repository.rs b/lib/src/dictionary/infrastructure/sqlite_dict_repository.rs index 48f0e93..96e74d5 100644 --- a/lib/src/dictionary/infrastructure/sqlite_dict_repository.rs +++ b/lib/src/dictionary/infrastructure/sqlite_dict_repository.rs @@ -1,6 +1,5 @@ -use crate::common::entities::{Dict, DictEntry}; use crate::common::errors::RepositoryError; -use crate::common::traits::DictRepository; +use crate::dictionary::{Dict, DictEntry, DictRepository}; use futures::TryStreamExt; use futures::stream::BoxStream; diff --git a/lib/src/dictionary/service.rs b/lib/src/dictionary/service.rs new file mode 100644 index 0000000..e69de29 diff --git a/lib/src/lib.rs b/lib/src/lib.rs index 33fc17d..5fc5398 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -12,9 +12,9 @@ mod common; mod dictionary; pub mod sys_major; -pub use self::common::DictRepository; pub use self::common::SystemDecoder; pub use self::common::SystemEncoder; pub use self::dictionary::DictImporter; +pub use self::dictionary::DictRepository; pub use self::dictionary::JsonFileDictSource; pub use self::dictionary::SqliteDictRepository;