1pub mod candidate;
10pub mod config;
12mod fzf_query;
14pub mod matcher;
16pub mod normalize;
18pub mod query;
20pub mod rank;
22pub mod stats;
24
25use std::fmt;
26use std::str::FromStr;
27
28pub use candidate::{
29 build_candidate, build_index, dedup_and_limit_keys, Candidate, MappedText, MappedTextBuilder,
30 SearchKey, SourceSpan,
31};
32pub use config::{KeyBudget, MatcherAlgo, QueryBudget, SearchConfig, Tiebreak};
33pub use matcher::{
34 match_positions, score_exact_text, score_text, ExactMatcher, GreedyMatcher, MatchPositions,
35 MatcherBackend, NucleoMatcher,
36};
37pub use query::{
38 base_query_variants, dedup_and_limit_variants, key_kind_allowed, PlainBackend, QueryVariant,
39};
40pub use rank::{search, search_with_stats, ScoredCandidate};
41pub use stats::SearchStats;
42
43#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
44pub enum LangMode {
46 Plain,
48 Japanese,
50 Korean,
52 Chinese,
54 All,
56}
57
58impl fmt::Display for LangMode {
59 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
60 match self {
61 LangMode::Plain => f.write_str("plain"),
62 LangMode::Japanese => f.write_str("ja"),
63 LangMode::Korean => f.write_str("ko"),
64 LangMode::Chinese => f.write_str("zh"),
65 LangMode::All => f.write_str("all"),
66 }
67 }
68}
69
70impl FromStr for LangMode {
71 type Err = String;
72
73 fn from_str(value: &str) -> Result<Self, Self::Err> {
74 match value {
75 "plain" => Ok(LangMode::Plain),
76 "ja" | "japanese" => Ok(LangMode::Japanese),
77 "ko" | "korean" => Ok(LangMode::Korean),
78 "zh" | "chinese" => Ok(LangMode::Chinese),
79 "all" => Ok(LangMode::All),
80 other => Err(format!("unsupported language mode: {other}")),
81 }
82 }
83}
84
85#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
86pub enum KeyKind {
88 Original,
90 Normalized,
92 KanaReading,
94 RomajiReading,
96 PinyinFull,
98 PinyinJoined,
100 PinyinInitials,
102 KoreanRomanized,
104 KoreanInitials,
106 KoreanKeyboard,
108 LearnedAlias,
110}
111
112#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
113pub enum QueryVariantKind {
115 Original,
117 Normalized,
119 Kana,
121 RomajiToKana,
123 Pinyin,
125 Initials,
127}
128
129pub trait LanguageBackend: Send + Sync {
131 fn mode(&self) -> LangMode;
133
134 fn normalize_candidate(&self, text: &str) -> String {
136 normalize::normalize(text)
137 }
138
139 fn build_candidate_keys(&self, text: &str, budget: KeyBudget) -> Vec<SearchKey>;
141
142 fn expand_query(&self, query: &str, budget: QueryBudget) -> Vec<QueryVariant>;
144}