use std::path::Path;
use crate::LinderaResult;
use crate::dictionary::metadata::Metadata;
use crate::error::LinderaErrorKind;
#[cfg(feature = "mmap")]
use crate::util::mmap_file;
use crate::util::read_file;
pub struct MetadataLoader {}
impl MetadataLoader {
pub fn load(input_dir: &Path) -> LinderaResult<Metadata> {
let data = read_file(input_dir.join("metadata.json").as_path())?;
let metadata: Metadata = serde_json::from_slice(&data).map_err(|err| {
LinderaErrorKind::Deserialize
.with_error(anyhow::anyhow!(err))
.add_context("Failed to deserialize metadata.json file")
})?;
Ok(metadata)
}
#[cfg(feature = "mmap")]
pub fn load_mmap(input_dir: &Path) -> LinderaResult<Metadata> {
let data = mmap_file(input_dir.join("metadata.json").as_path())?;
let metadata: Metadata = serde_json::from_slice(&data).map_err(|err| {
LinderaErrorKind::Deserialize
.with_error(anyhow::anyhow!(err))
.add_context("Failed to deserialize metadata.json file (mmap)")
})?;
Ok(metadata)
}
}
#[cfg(test)]
mod tests {
use crate::builder::metadata::MetadataBuilder;
use crate::dictionary::metadata::Metadata;
use super::*;
#[test]
fn test_metadata_load() {
let temp_path = std::env::temp_dir().join("lindera_test_metadata");
std::fs::create_dir_all(&temp_path).unwrap();
let metadata = Metadata::default();
let metadata_builder = MetadataBuilder::new();
metadata_builder.build(&metadata, &temp_path).unwrap();
let loaded_metadata = MetadataLoader::load(&temp_path).unwrap();
assert_eq!(loaded_metadata.encoding, "UTF-8");
assert_eq!(loaded_metadata.default_word_cost, -10000);
assert_eq!(loaded_metadata.default_left_context_id, 1288);
std::fs::remove_dir_all(&temp_path).ok();
}
#[test]
fn test_metadata_load_nonexistent_file() {
let temp_path = std::env::temp_dir().join("lindera_test_nonexistent");
let result = MetadataLoader::load(&temp_path);
assert!(result.is_err());
}
}