ferrous_opencc/
lib.rs

1//! # 纯 Rust 实现的 OpenCC
2//!
3//! 为繁体中文和简体中文之间提供高性能的转换。
4//!
5//! ## 示例
6//!
7//! ```no_run
8//! use ferrous_opencc::OpenCC;
9//!
10//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
11//! // 创建 OpenCC 实例
12//! let opencc = OpenCC::new("path/to/your/s2t.json")?;
13//!
14//! // 转换文本
15//! let text = "“开放中文转换”是完全由 Rust 实现的。";
16//! let converted = opencc.convert(text);
17//!
18//! assert_eq!(converted, "「開放中文轉換」是完全由 Rust 實現的。");
19//! # Ok(())
20//! # }
21//! ```
22
23pub mod compiler;
24pub mod config;
25pub mod conversion;
26pub mod dictionary;
27pub mod error;
28
29use config::Config;
30use conversion::ConversionChain;
31use error::Result;
32use std::path::Path;
33
34include!(concat!(env!("OUT_DIR"), "/embedded_map.rs"));
35
36/// 核心的 OpenCC 转换器
37pub struct OpenCC {
38    /// 配置名称
39    name: String,
40    /// 用于执行转换的词典链
41    conversion_chain: ConversionChain,
42}
43
44impl OpenCC {
45    /// 从配置文件创建一个新的 `OpenCC` 实例。
46    /// 解析 JSON 配置文件,加载所有必需的词典,并构建转换流程。
47    ///
48    /// # 参数
49    ///
50    /// * `config_path`: 指向主 JSON 配置文件(例如 `s2t.json`)的路径
51    ///
52    /// # 返回
53    ///
54    /// 一个 `Result`,其中包含新的 `OpenCC` 实例,或者在加载失败时返回错误
55    pub fn new<P: AsRef<Path>>(config_path: P) -> Result<Self> {
56        // 1. 解析配置文件
57        let config = Config::from_file(config_path)?;
58        let config_dir = config.get_config_directory();
59
60        // 2. 初始化转换链
61        let conversion_chain = ConversionChain::from_config(&config.conversion_chain, config_dir)?;
62
63        Ok(Self {
64            name: config.name,
65            conversion_chain,
66        })
67    }
68
69    // 从嵌入的资源创建 OpenCC 实例
70    pub fn from_config_name(name: &str) -> Result<Self> {
71        use crate::dictionary::embedded;
72
73        let config_str = embedded::EMBEDDED_CONFIGS
74            .get(name)
75            .ok_or_else(|| error::OpenCCError::ConfigNotFound(name.to_string()))?;
76
77        // 从字符串解析配置
78        let config: Config = config_str.parse()?;
79
80        let conversion_chain = ConversionChain::from_config_embedded(&config.conversion_chain)?;
81
82        Ok(Self {
83            name: config.name,
84            conversion_chain,
85        })
86    }
87
88    /// 根据加载的配置转换字符串
89    ///
90    /// # 参数
91    ///
92    /// * `input`: 需要转换的字符串
93    ///
94    /// # 返回
95    ///
96    /// 转换后的字符串
97    pub fn convert(&self, input: &str) -> String {
98        self.conversion_chain.convert(input)
99    }
100
101    /// 返回当前加载的配置名称
102    pub fn name(&self) -> &str {
103        &self.name
104    }
105}