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
36include!(concat!(env!("OUT_DIR"), "/embedded_map.rs"));
37
38pub struct OpenCC {
40 name: String,
42 segmentation: Box<dyn Segmentation>,
44 conversion_chain: ConversionChain,
46}
47
48impl OpenCC {
49 pub fn new<P: AsRef<Path>>(config_path: P) -> Result<Self> {
60 let config = Config::from_file(config_path)?;
62 let config_dir = config.get_config_directory();
63
64 let segmentation = SegmentationType::from_config(&config.segmentation, config_dir)?;
66
67 let conversion_chain = ConversionChain::from_config(&config.conversion_chain, config_dir)?;
69
70 Ok(Self {
71 name: config.name,
72 segmentation: segmentation.into_segmenter(),
73 conversion_chain,
74 })
75 }
76
77 pub fn from_config_name(name: &str) -> Result<Self> {
79 use crate::dictionary::embedded;
80
81 let config_str = embedded::EMBEDDED_CONFIGS
82 .get(name)
83 .ok_or_else(|| error::OpenCCError::ConfigNotFound(name.to_string()))?;
84
85 let config: Config = config_str.parse()?;
87
88 let segmentation = SegmentationType::from_config_embedded(&config.segmentation)?;
90 let conversion_chain = ConversionChain::from_config_embedded(&config.conversion_chain)?;
91
92 Ok(Self {
93 name: config.name,
94 segmentation: segmentation.into_segmenter(),
95 conversion_chain,
96 })
97 }
98
99 pub fn convert(&self, input: &str) -> String {
109 let segments = self.segmentation.segment(input);
111 self.conversion_chain.convert(&segments)
113 }
114
115 pub fn name(&self) -> &str {
117 &self.name
118 }
119}