use pyo3::prelude::*;
use unicode_normalization::UnicodeNormalization;
#[pyfunction]
#[pyo3(signature = (text, *, form = "NFC"))]
pub fn _normalize(text: &str, form: &str) -> PyResult<String> {
Ok(crate::normalize::normalize(text, form)?)
}
#[pyfunction]
#[pyo3(signature = (text, *, form = "NFC"))]
pub fn _is_normalized(text: &str, form: &str) -> PyResult<bool> {
Ok(crate::normalize::is_normalized(text, form)?)
}
#[pyfunction]
#[pyo3(signature = (texts, *, form = "NFC"))]
pub fn _normalize_batch(py: Python<'_>, texts: Vec<String>, form: &str) -> PyResult<Vec<String>> {
crate::normalize::validate_form(form)?;
if texts.len() > crate::MAX_BATCH_SIZE {
return Err(crate::ErrorRepr::BatchTooLarge {
len: texts.len(),
max: crate::MAX_BATCH_SIZE,
}
.into());
}
let normalize_one: fn(&str) -> String = match form {
"NFC" => |t| t.nfc().collect(),
"NFD" => |t| t.nfd().collect(),
"NFKC" => |t| t.nfkc().collect(),
"NFKD" => |t| t.nfkd().collect(),
_ => unreachable!(),
};
Ok(py.detach(move || texts.iter().map(|t| normalize_one(t)).collect()))
}