duckling 0.4.0

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

use super::{QuantityData, QuantityUnit};

fn quantity_data(td: &TokenData) -> Option<&QuantityData> {
    match td {
        TokenData::Quantity(d) => Some(d),
        _ => None,
    }
}

pub fn rules() -> Vec<Rule> {
    vec![
        Rule {
            name: "<number> <units>".to_string(),
            pattern: vec![
                crate::pattern::predicate(is_positive),
                regex("(de )?livr(a|e|ă)"),
            ],
            production: Box::new(|nodes| {
                let n = numeral_data(&nodes[0].token_data)?;
                Some(TokenData::Quantity(QuantityData::new(
                    n.value,
                    QuantityUnit::Pound,
                )))
            }),
        },
        Rule {
            name: "<quantity> of product".to_string(),
            pattern: vec![
                dim(DimensionKind::Quantity),
                regex("de (carne|can[aă]|zah[aă]r|mamaliga)"),
            ],
            production: Box::new(|nodes| {
                let mut q = quantity_data(&nodes[0].token_data)?.clone();
                let product = match &nodes[1].token_data {
                    TokenData::RegexMatch(m) => m.group(1)?,
                    _ => return None,
                };
                q.product = Some(product.to_lowercase());
                Some(TokenData::Quantity(q))
            }),
        },
    ]
}