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::NumeralData;

fn is_number_value(s: &str) -> Option<f64> {
    match s {
        "núll" | "null" => Some(0.0),
        "einn" => Some(1.0),
        "tveir" => Some(2.0),
        "þrír" => Some(3.0),
        "fjórir" => Some(4.0),
        "fimm" => Some(5.0),
        "sex" => Some(6.0),
        "sjö" => Some(7.0),
        "átta" => Some(8.0),
        "níu" => Some(9.0),
        "tíu" => Some(10.0),
        "ellefu" => Some(11.0),
        "tólf" => Some(12.0),
        "þrettán" => Some(13.0),
        "fjórtán" => Some(14.0),
        "fimmtán" => Some(15.0),
        "sextán" => Some(16.0),
        "sautján" => Some(17.0),
        "átján" => Some(18.0),
        "nítján" => Some(19.0),
        "tuttugu" => Some(20.0),
        _ => None,
    }
}

pub fn rules() -> Vec<Rule> {
    vec![Rule {
        name: "number (0..20)".to_string(),
        pattern: vec![regex(
            r"(n[úu]ll|einn|tveir|þrír|fjórir|fimm(tán)?|sex(tán)?|sjö|átta|níu|tíu|ellefu|tólf|þrettán|fjórtán|sautján|átján|nítján|tuttugu)",
        )],
        production: Box::new(|nodes| {
            let s = match &nodes[0].token_data {
                TokenData::RegexMatch(m) => m.group(1)?.to_lowercase(),
                _ => return None,
            };
            Some(TokenData::Numeral(NumeralData::new(is_number_value(&s)?)))
        }),
    }]
}