mod de;
mod en;
mod es;
mod fr;
mod it;
mod nl;
mod pt;
use crate::digit_string::DigitString;
use crate::error::Error;
pub use de::German;
pub use en::English;
pub use es::Spanish;
pub use fr::French;
pub use it::Italian;
pub use nl::Dutch;
pub use pt::Portuguese;
pub trait BasicAnnotate {
fn text_lowercase(&self) -> &str;
fn set_nan(&mut self, val: bool);
}
#[derive(Debug, PartialEq)]
pub enum MorphologicalMarker {
Ordinal(&'static str),
Fraction(&'static str),
None,
}
impl MorphologicalMarker {
pub fn is_ordinal(&self) -> bool {
matches!(self, Self::Ordinal(_))
}
pub fn is_fraction(&self) -> bool {
matches!(self, Self::Fraction(_))
}
pub fn is_none(&self) -> bool {
matches!(self, Self::None)
}
}
pub trait LangInterpreter {
fn apply(&self, num_func: &str, b: &mut DigitString) -> Result<(), Error>;
fn apply_decimal(&self, decimal_func: &str, b: &mut DigitString) -> Result<(), Error>;
fn get_morph_marker(&self, word: &str) -> MorphologicalMarker;
fn check_decimal_separator(&self, word: &str) -> Option<char>;
fn format_and_value(&self, b: &DigitString) -> (String, f64);
fn format_decimal_and_value(
&self,
int: &DigitString,
dec: &DigitString,
sep: char,
) -> (String, f64);
fn is_linking(&self, word: &str) -> bool;
fn exec_group<'a, I: Iterator<Item = &'a str>>(&self, group: I) -> Result<DigitString, Error> {
let mut b = DigitString::new();
let mut incomplete: bool = false;
for token in group {
incomplete = match self.apply(token, &mut b) {
Err(Error::Incomplete) => true,
Ok(()) => false,
Err(error) => return Err(error),
};
}
if incomplete {
Err(Error::Incomplete)
} else {
Ok(b)
}
}
fn basic_annotate<T: BasicAnnotate>(&self, _tokens: &mut Vec<T>) {}
}
pub enum Language {
English(English),
French(French),
German(German),
Italian(Italian),
Spanish(Spanish),
Dutch(Dutch),
Portuguese(Portuguese),
}
impl Language {
pub fn french() -> Self {
Language::French(French::default())
}
pub fn english() -> Self {
Language::English(English::default())
}
pub fn german() -> Self {
Language::German(German::default())
}
pub fn italian() -> Self {
Language::Italian(Italian::default())
}
pub fn spanish() -> Self {
Language::Spanish(Spanish::default())
}
pub fn dutch() -> Self {
Language::Dutch(Dutch::default())
}
pub fn portuguese() -> Self {
Language::Portuguese(Portuguese::default())
}
}
macro_rules! delegate {
($($variant:ident), +) => {
fn apply(&self, num_func: &str, b: &mut DigitString) -> Result<(), Error> {
match self {
$(
Language::$variant(l) => l.apply(num_func, b),
)*
}
}
fn apply_decimal(&self, decimal_func: &str, b: &mut DigitString) -> Result<(), Error> {
match self {
$(
Language::$variant(l) => l.apply_decimal(decimal_func, b),
)*
}
}
fn get_morph_marker(&self, word: &str) -> MorphologicalMarker {
match self {
$(
Language::$variant(l) => l.get_morph_marker(word),
)*
}
}
fn check_decimal_separator(&self, word: &str) -> Option<char>{
match self {
$(
Language::$variant(l) => l.check_decimal_separator(word),
)*
}
}
fn format_and_value(&self, b: &DigitString) -> (String, f64){
match self{
$(
Language::$variant(l) => l.format_and_value(b),
)*
}
}
fn format_decimal_and_value(&self, int: &DigitString, dec: &DigitString, sep: char) -> (String, f64) {
match self {
$(
Language::$variant(l) => l.format_decimal_and_value(int, dec, sep),
)*
}
}
fn is_linking(&self, word: &str) -> bool {
match self {
$(
Language::$variant(l) => l.is_linking(word),
)*
}
}
fn basic_annotate<T: BasicAnnotate>(&self, tokens: &mut Vec<T>) {
match self {
$(
Language::$variant(l) => l.basic_annotate(tokens),
)*
}
}
};
}
impl LangInterpreter for Language {
delegate!(Dutch, French, English, German, Italian, Spanish, Portuguese);
}