opencc-rs 0.6.0

OpenCC bindings for Rust
Documentation
use std::collections::HashMap;
use std::fs;

use opencc_rs::{Config, OpenCC};
use pretty_assertions::assert_eq;
use serde::Deserialize;
use testresult::TestResult;

#[derive(Debug, Deserialize)]
struct TestCases {
    cases: Vec<TestCase>,
}

#[derive(Debug, Deserialize)]
struct TestCase {
    id: String,
    input: String,
    expected: HashMap<String, String>,
}

#[test]
fn all() -> TestResult {
    let test_cases = fs::read_to_string(format!(
        "{}/tests/testcases.json",
        env!("CARGO_MANIFEST_DIR")
    ))?;
    let test_cases: TestCases = serde_json::from_str(&test_cases)?;

    for case in test_cases.cases {
        for (config_name, expected) in &case.expected {
            let opencc = OpenCC::new([config_from_name(config_name)])?;
            let actual = opencc.convert(&case.input)?;

            assert_eq!(
                expected, &actual,
                "case `{}` failed for config `{}` with input {:?}",
                case.id, config_name, case.input
            );
        }
    }

    Ok(())
}

fn config_from_name(name: &str) -> Config {
    match name {
        "s2t" => Config::S2T,
        "t2s" => Config::T2S,
        "s2tw" => Config::S2TW,
        "tw2s" => Config::TW2S,
        "s2hk" => Config::S2HK,
        "hk2s" => Config::HK2S,
        "s2twp" => Config::S2TWP,
        "tw2sp" => Config::TW2SP,
        "t2tw" => Config::T2TW,
        "tw2t" => Config::TW2T,
        "t2hk" => Config::T2HK,
        "hk2t" => Config::HK2T,
        "s2hkp" => Config::S2HKP,
        "hk2sp" => Config::HK2SP,
        "t2jp" => Config::T2JP,
        "jp2t" => Config::JP2T,
        _ => unreachable!(),
    }
}