//! Crate wrapping what we need from ICU’s C API for JIDs.
//!
//! See
use crate::bindings::{
icu_spoof_get_skeleton, icu_spoof_open, icu_spoof_set_checks, UErrorCode, USpoofChecker,
U_ZERO_ERROR,
};
use crate::error::Error;
/// TODO: spoof checker.
pub struct SpoofChecker {
inner: *mut USpoofChecker,
}
impl SpoofChecker {
/// Create a new SpoofChecker.
pub fn new(checks: i32) -> Result {
let mut err: UErrorCode = U_ZERO_ERROR;
let inner = unsafe { icu_spoof_open(&mut err) };
if err != U_ZERO_ERROR {
return Err(err);
}
unsafe { icu_spoof_set_checks(inner, checks, &mut err) };
if err != U_ZERO_ERROR {
return Err(err);
}
Ok(SpoofChecker { inner })
}
/// Transform a string into a skeleton for matching it with other potentially similar strings.
pub fn get_skeleton(&self, input: &str) -> Result {
let mut err: UErrorCode = U_ZERO_ERROR;
let mut dest: Vec = vec![0u8; 256];
let len = unsafe {
icu_spoof_get_skeleton(
self.inner,
0,
input.as_ptr(),
input.len() as i32,
dest.as_mut_ptr(),
dest.len() as i32,
&mut err,
)
};
if err != U_ZERO_ERROR {
return Err(Error::from_icu_code(err));
}
dest.truncate(len as usize);
Ok(String::from_utf8(dest)?)
}
}