rustfst 0.5.0

Library for constructing, combining, optimizing, and searching weighted finite-state transducers (FSTs).
Documentation
use std::fmt::Display;

use failure::{format_err, Fallible};
use serde_derive::{Deserialize, Serialize};

use crate::algorithms::minimize;
use crate::fst_traits::{AllocableFst, MutableFst, SerializableFst};
use crate::semirings::SerializableSemiring;
use crate::semirings::WeaklyDivisibleSemiring;
use crate::semirings::WeightQuantize;
use crate::tests_openfst::FstTestData;

#[derive(Serialize, Deserialize, Debug)]
pub struct MinimizeOperationResult {
    allow_nondet: bool,
    result: String,
}

pub struct MinimizeTestData<F>
where
    F: SerializableFst,
    F::W: SerializableSemiring,
{
    allow_nondet: bool,
    result: Fallible<F>,
}

impl MinimizeOperationResult {
    pub fn parse<F>(&self) -> MinimizeTestData<F>
    where
        F: SerializableFst,
        F::W: SerializableSemiring,
    {
        MinimizeTestData {
            allow_nondet: self.allow_nondet,
            result: match self.result.as_str() {
                "error" => Err(format_err!("lol")),
                _ => F::from_text_string(self.result.as_str()),
            },
        }
    }
}

pub fn test_minimize<F>(test_data: &FstTestData<F>) -> Fallible<()>
where
    F: SerializableFst + MutableFst + AllocableFst + Display,
    F::W: SerializableSemiring + WeaklyDivisibleSemiring + WeightQuantize + 'static,
{
    for minimize_data in &test_data.minimize {
        //        println!("Minimize : allow_nondet = {}", minimize_data.allow_nondet);
        let mut fst_raw = test_data.raw.clone();
        let fst_res: Fallible<F> =
            minimize(&mut fst_raw, minimize_data.allow_nondet).map(|_| fst_raw);

        match (&minimize_data.result, fst_res) {
            (Ok(fst_expected), Ok(ref fst_minimized)) => {
                assert_eq_fst!(
                    fst_expected,
                    fst_minimized,
                    format!(
                        "Minimize fail for allow_nondet = {:?} ",
                        minimize_data.allow_nondet
                    )
                );
            }
            (Ok(_fst_expected), Err(_)) => panic!(
                "Minimize fail for allow_nondet {:?}. Got Err. Expected Ok",
                minimize_data.allow_nondet
            ),
            (Err(_), Ok(_fst_minimized)) => panic!(
                "Minimize fail for allow_nondet {:?}. Got Ok. Expected Err, \n{}",
                minimize_data.allow_nondet, _fst_minimized
            ),
            (Err(_), Err(_)) => {
                // Ok
            }
        };
    }
    Ok(())
}