use std::collections::HashMap;
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum RangeStyle {
#[default]
Compact,
FromTo,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum PhoneStyle {
#[default]
Grouped,
DigitByDigit,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum SymbolStyle {
#[default]
Expand,
Preserve,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum DateStyle {
#[default]
Formal,
Spoken,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum ColonStyle {
#[default]
Contextual,
Clock,
Ratio,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum NumericDateOrder {
#[default]
DayMonthYear,
MonthDayYear,
PreserveAmbiguous,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum CurrencySymbolPolicy {
#[default]
AssumeCommon,
PreserveAmbiguous,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum QuoteStyle {
#[default]
Keep,
Guillemets,
Straight,
Strip,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum InputTolerance {
#[default]
Strict,
Asr,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum NormalizePreset {
#[default]
Default,
TtsFriendly,
Conservative,
SearchIndexing,
}
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct NormalizeOptions {
pub expand_known_acronyms: bool,
pub spell_unknown_acronyms: bool,
pub normalize_english_words: bool,
pub transliterate_latin: bool,
pub repair_homoglyphs: bool,
pub validate_dates: bool,
pub parse_thousand_separators: bool,
pub normalize_network_addresses: bool,
pub quote_style: QuoteStyle,
pub range_style: RangeStyle,
pub phone_style: PhoneStyle,
pub symbol_style: SymbolStyle,
pub date_style: DateStyle,
pub colon_style: ColonStyle,
pub numeric_date_order: NumericDateOrder,
pub currency_symbol_policy: CurrencySymbolPolicy,
pub input_tolerance: InputTolerance,
pub asr_vocabulary: Vec<String>,
pub vocabulary: HashMap<String, String>,
}
impl Default for NormalizeOptions {
fn default() -> Self {
Self {
expand_known_acronyms: true,
spell_unknown_acronyms: true,
normalize_english_words: true,
transliterate_latin: true,
repair_homoglyphs: true,
validate_dates: true,
parse_thousand_separators: true,
normalize_network_addresses: true,
quote_style: QuoteStyle::default(),
range_style: RangeStyle::default(),
phone_style: PhoneStyle::default(),
symbol_style: SymbolStyle::default(),
date_style: DateStyle::default(),
colon_style: ColonStyle::default(),
numeric_date_order: NumericDateOrder::default(),
currency_symbol_policy: CurrencySymbolPolicy::default(),
input_tolerance: InputTolerance::default(),
asr_vocabulary: Vec::new(),
vocabulary: HashMap::new(),
}
}
}
impl NormalizeOptions {
#[must_use]
pub fn preset(preset: NormalizePreset) -> Self {
let base = Self::default();
match preset {
NormalizePreset::Default => base,
NormalizePreset::TtsFriendly => Self {
range_style: RangeStyle::FromTo,
phone_style: PhoneStyle::DigitByDigit,
date_style: DateStyle::Spoken,
quote_style: QuoteStyle::Strip,
..base
},
NormalizePreset::Conservative => Self {
repair_homoglyphs: false,
expand_known_acronyms: false,
spell_unknown_acronyms: false,
normalize_english_words: false,
transliterate_latin: false,
symbol_style: SymbolStyle::Preserve,
..base
},
NormalizePreset::SearchIndexing => Self {
quote_style: QuoteStyle::Straight,
spell_unknown_acronyms: false,
normalize_english_words: false,
transliterate_latin: false,
symbol_style: SymbolStyle::Preserve,
..base
},
}
}
}
impl From<NormalizePreset> for NormalizeOptions {
fn from(preset: NormalizePreset) -> Self {
Self::preset(preset)
}
}