rustfst 0.5.0

Library for constructing, combining, optimizing, and searching weighted finite-state transducers (FSTs).
Documentation
use failure::Fallible;
use serde_derive::{Deserialize, Serialize};

use crate::algorithms::{union, UnionFst};
use crate::fst_impls::VectorFst;
use crate::fst_traits::SerializableFst;
use crate::semirings::{SerializableSemiring, WeaklyDivisibleSemiring, WeightQuantize};
use crate::tests_openfst::algorithms::dynamic_fst::compare_fst_static_dynamic;
use crate::tests_openfst::FstTestData;

#[derive(Serialize, Deserialize, Debug)]
pub struct UnionOperationResult {
    fst_2: String,
    result_static: String,
    result_dynamic: String,
}

pub struct UnionTestData<F>
where
    F: SerializableFst,
    F::W: SerializableSemiring,
{
    pub fst_2: F,
    pub result_static: F,
    pub result_dynamic: F,
}

impl UnionOperationResult {
    pub fn parse<F>(&self) -> UnionTestData<F>
    where
        F: SerializableFst,
        F::W: SerializableSemiring,
    {
        UnionTestData {
            fst_2: F::from_text_string(self.fst_2.as_str()).unwrap(),
            result_static: F::from_text_string(self.result_static.as_str()).unwrap(),
            result_dynamic: F::from_text_string(self.result_dynamic.as_str()).unwrap(),
        }
    }
}

pub fn test_union<W>(test_data: &FstTestData<VectorFst<W>>) -> Fallible<()>
where
    W: SerializableSemiring + WeightQuantize + WeaklyDivisibleSemiring + 'static,
    W::ReverseWeight: 'static,
{
    for union_test_data in &test_data.union {
        let mut fst_res_static = test_data.raw.clone();
        union(&mut fst_res_static, &union_test_data.fst_2)?;

        assert_eq!(
            union_test_data.result_static,
            fst_res_static,
            "{}",
            error_message_fst!(
                union_test_data.result_static,
                fst_res_static,
                format!("Union failed")
            )
        );
    }
    Ok(())
}

pub fn test_union_dynamic<W>(test_data: &FstTestData<VectorFst<W>>) -> Fallible<()>
where
    W: SerializableSemiring + WeightQuantize + WeaklyDivisibleSemiring + 'static,
    W::ReverseWeight: 'static,
{
    for union_test_data in &test_data.union {
        let union_dynamic_fst_openfst = &union_test_data.result_dynamic;
        let union_dynamic_fst =
            UnionFst::new(test_data.raw.clone(), union_test_data.fst_2.clone())?;

        compare_fst_static_dynamic(union_dynamic_fst_openfst, &union_dynamic_fst)?;
    }
    Ok(())
}