use crate::{
Embed,
message::{Message, embed::Field},
};
impl<'a> Message<'a> {
pub(crate) fn truncate(&mut self) {
self.json.embeds.truncate(10);
let mut left: usize = 6000;
for embed in &mut self.json.embeds.iter_mut() {
if left == 0 {
embed.title.clear();
embed.description.clear();
embed.fields.clear();
continue;
}
embed.truncate(&mut left);
}
self.json.embeds.retain(|embed| !embed.is_empty());
}
}
impl Embed {
fn truncate(&mut self, left: &mut usize) {
truncate_string(&mut self.title, left);
truncate_string(&mut self.description, left);
self.fields.retain_mut(|field| {
if *left == 0 {
return false;
}
truncate_string(&mut field.name, left);
truncate_string(&mut field.value, left);
!field.name.is_empty() || !field.value.is_empty()
});
}
fn is_empty(&self) -> bool {
self.title.is_empty()
&& self.description.is_empty()
&& self.fields.iter().all(Field::is_empty)
}
}
impl Field {
fn is_empty(&self) -> bool {
self.name.is_empty() && self.value.is_empty()
}
}
fn truncate_string(s: &mut String, left: &mut usize) {
if *left == 0 {
s.clear();
return;
}
let len = s.len();
if len <= *left {
*left -= len;
return;
}
let new_len = s
.char_indices()
.take_while(|(i, _)| *i <= *left)
.map(|(i, _)| i)
.last()
.unwrap_or(0);
s.truncate(new_len);
*left = 0;
}