use std::borrow::Cow; use std::str; use charabia::{Language, Script}; use heed::BoxedError; pub struct ScriptLanguageCodec; impl<'a> heed::BytesDecode<'a> for ScriptLanguageCodec { type DItem = (Script, Language); fn bytes_decode(bytes: &'a [u8]) -> Result { let sep = bytes .iter() .position(|b| *b == 0) .ok_or("cannot find nul byte") .map_err(BoxedError::from)?; let (s_bytes, l_bytes) = bytes.split_at(sep); let script = str::from_utf8(s_bytes)?; let script_name = Script::from_name(script); let lan = str::from_utf8(l_bytes)?; // skip '\0' byte between the two strings. let lan_name = Language::from_name(&lan[1..]); Ok((script_name, lan_name)) } } impl<'a> heed::BytesEncode<'a> for ScriptLanguageCodec { type EItem = (Script, Language); fn bytes_encode((script, lan): &Self::EItem) -> Result, BoxedError> { let script_name = script.name().as_bytes(); let lan_name = lan.name().as_bytes(); let mut bytes = Vec::with_capacity(script_name.len() + lan_name.len() + 1); bytes.extend_from_slice(script_name); bytes.push(0); bytes.extend_from_slice(lan_name); Ok(Cow::Owned(bytes)) } }