duckling 0.4.0

A Rust port of Facebook's Duckling library for parsing natural language into structured data
Documentation
use crate::pattern::regex;
use crate::types::{Rule, TokenData};

use super::OrdinalData;

fn lookup_ordinal(s: &str) -> Option<i64> {
    match s.to_lowercase().as_str() {
        "primer" | "primers" | "primera" | "primeres" => Some(1),
        "segon" | "segona" | "segons" | "segones" => Some(2),
        "tercer" | "tercera" | "tercers" | "terceres" => Some(3),
        "quart" | "quarta" | "quarts" | "quartes" => Some(4),
        "cinquè" | "cinquena" | "cinquens" | "cinquenes" => Some(5),
        "sisè" | "sisena" | "sisens" | "sisenes" => Some(6),
        "setè" | "setena" | "setens" | "setenes" => Some(7),
        "vuitè" | "vuitena" | "vuitens" | "vuitenes" => Some(8),
        "novè" | "novena" | "novens" | "novenes" => Some(9),
        "desè" | "desena" | "desens" | "desenes" => Some(10),
        "onzè" | "onzena" => Some(11),
        "dotzè" | "dotzena" => Some(12),
        "tretzè" | "tretzena" => Some(13),
        "catorzè" | "catorzena" => Some(14),
        "quinzè" | "quinzena" => Some(15),
        "setzè" | "setzena" => Some(16),
        "dissetè" | "dissetena" => Some(17),
        "divuitè" | "divuitena" => Some(18),
        "dinovè" | "dinovena" => Some(19),
        "vintè" | "vintena" => Some(20),
        _ => None,
    }
}

pub fn rules() -> Vec<Rule> {
    vec![Rule {
        name: "ordinals (primero..10)".to_string(),
        pattern: vec![regex(
            "(primer(a|s|es)?|segon(a|s|es)?|tercer(a|s|es)?|quart(a|s|es)?|cinqu(è|(en(a|s|es)))|sis(è|en(a|s|es))|set(è|en(a|s|es))|vuit(è|en(a|s|es))|nov(è|en(a|s|es))|des(è|en(a|s|es))|onz(è|ena)|dotz(è|ena)|tretz(è|ena)|catorz(è|ena)|quinz(è|ena)|setz(è|ena)|disset(è|ena)|divuit(è|ena)|dinov(è|ena)|vint(è|ena))",
        )],
        production: Box::new(|nodes| {
            let s = match &nodes[0].token_data {
                TokenData::RegexMatch(m) => m.group(1)?,
                _ => return None,
            };
            Some(TokenData::Ordinal(OrdinalData::new(lookup_ordinal(s)?)))
        }),
    }]
}