#![warn(missing_docs)]
#![deny(unsafe_code)]
#![cfg_attr(feature = "simd", feature(portable_simd))]
#![allow(
clippy::inline_always,
clippy::similar_names,
clippy::cast_precision_loss,
clippy::cast_possible_truncation,
clippy::option_if_let_else,
clippy::map_unwrap_or,
clippy::zero_sized_map_values,
clippy::missing_panics_doc,
clippy::unwrap_used
)]
pub mod dictionary;
pub mod domain;
pub mod entry_store;
pub mod file_watcher;
pub mod hot_reload;
pub mod lazy_entries;
pub mod loader;
pub mod matrix;
pub mod string_pool;
pub mod trie;
pub mod user_dict;
#[cfg(feature = "hot-reload-v2")]
pub mod hot_reload_v2;
pub use dictionary::{DictEntry, DictionaryLoader, LoadOptions, SystemDictionary};
pub use entry_store::{EagerStore, EntryStore, LazyStore};
pub use error::{DictError, Result};
pub use file_watcher::{FileEvent, FileWatcher, WatchConfig};
pub use hot_reload::{
DeltaUpdate, DeltaUpdateBuilder, EntryChange, HotReloadDictionary, Version, VersionInfo,
};
pub use lazy_entries::LazyEntries;
pub use loader::{LazyDictionary, LoaderConfig, MmapDictionary};
pub use matrix::{ConnectionMatrix, DenseMatrix, Matrix, MatrixLoader, MmapMatrix, SparseMatrix};
pub use string_pool::{ConcurrentStringPool, StringPool, StringPoolStats};
pub use trie::{DictionarySearcher, EntryIndex, PrefixMatch, Trie, TrieBuilder};
pub use user_dict::{UserDictionary, UserDictionaryBuilder, UserEntry};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Entry {
pub surface: String,
pub left_id: u16,
pub right_id: u16,
pub cost: i16,
pub feature: String,
}
pub trait Dictionary {
fn lookup(&self, surface: &str) -> Vec<Entry>;
fn get_connection_cost(&self, left_id: u16, right_id: u16) -> i16;
}
pub mod error {
use thiserror::Error;
#[derive(Error, Debug)]
pub enum DictError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Invalid dictionary format: {0}")]
Format(String),
#[error("Version mismatch: expected {expected}, found {found}")]
Version {
expected: u32,
found: u32,
},
}
pub type Result<T> = std::result::Result<T, DictError>;
}
pub mod format {
pub struct Header {
pub magic: [u8; 4],
pub version: u32,
pub entry_count: u32,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_entry_creation() {
let entry = Entry {
surface: "안녕".to_string(),
left_id: 1,
right_id: 1,
cost: 100,
feature: "NNG,*,T,안녕,*,*,*,*".to_string(),
};
assert_eq!(entry.surface, "안녕");
}
}