1pub mod compiler;
24pub mod config;
25pub mod conversion;
26pub mod dictionary;
27pub mod error;
28pub mod segmentation;
29
30use config::Config;
31use conversion::ConversionChain;
32use error::Result;
33use segmentation::{Segmentation, SegmentationType};
34use std::path::Path;
35
36#[cfg(feature = "embed-dictionaries")]
37include!(concat!(env!("OUT_DIR"), "/embedded_map.rs"));
38
39pub struct OpenCC {
41 name: String,
43 segmentation: Box<dyn Segmentation>,
45 conversion_chain: ConversionChain,
47}
48
49impl OpenCC {
50 pub fn new<P: AsRef<Path>>(config_path: P) -> Result<Self> {
61 let config = Config::from_file(config_path)?;
63 let config_dir = config.get_config_directory();
64
65 let segmentation = SegmentationType::from_config(&config.segmentation, config_dir)?;
67
68 let conversion_chain = ConversionChain::from_config(&config.conversion_chain, config_dir)?;
70
71 Ok(Self {
72 name: config.name,
73 segmentation: segmentation.into_segmenter(),
74 conversion_chain,
75 })
76 }
77
78 #[cfg(feature = "embed-dictionaries")]
80 pub fn from_config_name(name: &str) -> Result<Self> {
81 use crate::dictionary::embedded;
82
83 let config_str = embedded::EMBEDDED_CONFIGS
84 .get(name)
85 .ok_or_else(|| error::OpenCCError::ConfigNotFound(name.to_string()))?;
86
87 let config: Config = config_str.parse()?;
89
90 let segmentation = SegmentationType::from_config_embedded(&config.segmentation)?;
92 let conversion_chain = ConversionChain::from_config_embedded(&config.conversion_chain)?;
93
94 Ok(Self {
95 name: config.name,
96 segmentation: segmentation.into_segmenter(),
97 conversion_chain,
98 })
99 }
100
101 pub fn convert(&self, input: &str) -> String {
111 let segments = self.segmentation.segment(input);
113 self.conversion_chain.convert(&segments)
115 }
116
117 pub fn name(&self) -> &str {
119 &self.name
120 }
121}