use std::path::Path;
use lindera::dictionary::{
Dictionary, DictionaryBuilder, Metadata, UserDictionary,
load_dictionary as lindera_load_dictionary,
load_user_dictionary as lindera_load_user_dictionary,
};
use crate::error::to_napi_error;
use crate::metadata::JsMetadata;
#[napi(js_name = "Dictionary")]
pub struct JsDictionary {
pub(crate) inner: Dictionary,
}
#[napi]
impl JsDictionary {
#[napi]
pub fn metadata_name(&self) -> String {
self.inner.metadata.name.clone()
}
#[napi]
pub fn metadata_encoding(&self) -> String {
self.inner.metadata.encoding.clone()
}
#[napi]
pub fn metadata(&self) -> JsMetadata {
JsMetadata::from(self.inner.metadata.clone())
}
}
#[napi(js_name = "UserDictionary")]
pub struct JsUserDictionary {
pub(crate) inner: UserDictionary,
}
#[napi]
pub fn build_dictionary(
input_dir: String,
output_dir: String,
metadata: &JsMetadata,
) -> napi::Result<()> {
let input_path = Path::new(&input_dir);
let output_path = Path::new(&output_dir);
if !input_path.exists() {
return Err(napi::Error::new(
napi::Status::InvalidArg,
format!("Input directory does not exist: {input_dir}"),
));
}
let meta: Metadata = JsMetadata::to_lindera_metadata(metadata);
let builder = DictionaryBuilder::new(meta);
builder
.build_dictionary(input_path, output_path)
.map_err(|e| to_napi_error(format!("Failed to build dictionary: {e}")))?;
Ok(())
}
#[napi]
pub fn build_user_dictionary(
_kind: String,
input_file: String,
output_dir: String,
metadata: Option<&JsMetadata>,
) -> napi::Result<()> {
let input_path = Path::new(&input_file);
let output_path = Path::new(&output_dir);
if !input_path.exists() {
return Err(napi::Error::new(
napi::Status::InvalidArg,
format!("Input file does not exist: {input_file}"),
));
}
let meta = match metadata {
Some(m) => JsMetadata::to_lindera_metadata(m),
None => Metadata::default(),
};
let builder = DictionaryBuilder::new(meta);
builder
.build_user_dictionary(input_path, output_path)
.map_err(|e| to_napi_error(format!("Failed to build user dictionary: {e}")))?;
Ok(())
}
#[napi]
pub fn load_dictionary(uri: String) -> napi::Result<JsDictionary> {
lindera_load_dictionary(&uri)
.map_err(|e| to_napi_error(format!("Failed to load dictionary from '{uri}': {e}")))
.map(|inner| JsDictionary { inner })
}
#[napi]
pub fn load_user_dictionary(uri: String, metadata: &JsMetadata) -> napi::Result<JsUserDictionary> {
let meta: Metadata = JsMetadata::to_lindera_metadata(metadata);
lindera_load_user_dictionary(&uri, &meta)
.map_err(|e| to_napi_error(format!("Failed to load user dictionary from '{uri}': {e}")))
.map(|inner| JsUserDictionary { inner })
}