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() {
        "première" | "premiere" | "premier" => Some(1),
        "deuxième" | "deuxieme" | "second" | "seconde" => Some(2),
        "troisième" | "troisieme" => Some(3),
        "quatrième" | "quatrieme" => Some(4),
        "cinquième" | "cinquieme" => Some(5),
        "sixième" | "sixieme" => Some(6),
        "septième" | "septieme" => Some(7),
        "huitième" | "huitieme" => Some(8),
        "neuvième" | "neuvieme" => Some(9),
        "dixième" | "dixieme" => Some(10),
        "onzième" | "onzieme" => Some(11),
        "douzième" | "douzieme" => Some(12),
        "treizième" | "treizieme" => Some(13),
        "quatorzième" | "quatorzieme" => Some(14),
        "quinzième" | "quinzieme" => Some(15),
        "seizième" | "seizieme" => Some(16),
        _ => None,
    }
}

pub fn rules() -> Vec<Rule> {
    vec![
        Rule {
            name: "ordinal (digits)".to_string(),
            pattern: vec![regex("0*(\\d+) ?(ere?|ère|ème|eme|e)")],
            production: Box::new(|nodes| {
                let n = match &nodes[0].token_data {
                    TokenData::RegexMatch(m) => m.group(1)?,
                    _ => return None,
                };
                let v: i64 = n.parse().ok()?;
                Some(TokenData::Ordinal(OrdinalData::new(v)))
            }),
        },
        Rule {
            name: "ordinals (premier..seizieme)".to_string(),
            pattern: vec![regex(
                "(premi(ere?|ère)|(deux|trois|quatr|cinqu|six|sept|huit|neuv|dix|onz|douz|treiz|quatorz|quinz|seiz)i(e|è)me|seconde?)",
            )],
            production: Box::new(|nodes| {
                let txt = match &nodes[0].token_data {
                    TokenData::RegexMatch(m) => m.group(1)?,
                    _ => return None,
                };
                let v = lookup_ordinal(txt)?;
                Some(TokenData::Ordinal(OrdinalData::new(v)))
            }),
        },
    ]
}