#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EntitySpan {
pub offset: usize,
pub length: usize,
pub entity_type: String,
}
pub fn parse_message_entity(text: &str, offset: usize, length: usize) -> String {
let utf16: Vec<u16> = text.encode_utf16().collect();
let slice = &utf16[offset..(offset + length).min(utf16.len())];
String::from_utf16_lossy(slice)
}
pub fn parse_message_entities<'a>(
text: &str,
entities: &'a [EntitySpan],
types: Option<&[&str]>,
) -> Vec<(&'a EntitySpan, String)> {
entities
.iter()
.filter(|e| types.map_or(true, |ts| ts.contains(&e.entity_type.as_str())))
.map(|e| {
let extracted = parse_message_entity(text, e.offset, e.length);
(e, extracted)
})
.collect()
}