lindera_dictionary/loader/
metadata.rs1use std::path::Path;
2
3use crate::LinderaResult;
4use crate::dictionary::metadata::Metadata;
5use crate::error::LinderaErrorKind;
6#[cfg(feature = "mmap")]
7use crate::util::mmap_file;
8use crate::util::read_file;
9
10pub struct MetadataLoader {}
29
30impl MetadataLoader {
31 pub fn load(input_dir: &Path) -> LinderaResult<Metadata> {
45 let data = read_file(input_dir.join("metadata.json").as_path())?;
46
47 let metadata: Metadata = serde_json::from_slice(&data).map_err(|err| {
48 LinderaErrorKind::Deserialize
49 .with_error(anyhow::anyhow!(err))
50 .add_context("Failed to deserialize metadata.json file")
51 })?;
52
53 Ok(metadata)
54 }
55
56 #[cfg(feature = "mmap")]
69 pub fn load_mmap(input_dir: &Path) -> LinderaResult<Metadata> {
70 let data = mmap_file(input_dir.join("metadata.json").as_path())?;
71
72 let metadata: Metadata = serde_json::from_slice(&data).map_err(|err| {
73 LinderaErrorKind::Deserialize
74 .with_error(anyhow::anyhow!(err))
75 .add_context("Failed to deserialize metadata.json file (mmap)")
76 })?;
77
78 Ok(metadata)
79 }
80}
81
82#[cfg(test)]
83mod tests {
84 use crate::builder::metadata::MetadataBuilder;
85 use crate::dictionary::metadata::Metadata;
86
87 use super::*;
88
89 #[test]
90 fn test_metadata_load() {
91 let temp_path = std::env::temp_dir().join("lindera_test_metadata");
95 std::fs::create_dir_all(&temp_path).unwrap();
96
97 let metadata = Metadata::default();
99
100 let metadata_builder = MetadataBuilder::new();
102 metadata_builder.build(&metadata, &temp_path).unwrap();
103
104 let loaded_metadata = MetadataLoader::load(&temp_path).unwrap();
106
107 assert_eq!(loaded_metadata.encoding, "UTF-8");
108 assert_eq!(loaded_metadata.default_word_cost, -10000);
109 assert_eq!(loaded_metadata.default_left_context_id, 1288);
110 std::fs::remove_dir_all(&temp_path).ok();
112 }
113
114 #[test]
115 fn test_metadata_load_nonexistent_file() {
116 let temp_path = std::env::temp_dir().join("lindera_test_nonexistent");
117
118 let result = MetadataLoader::load(&temp_path);
120 assert!(result.is_err());
121 }
122}