parco-discord 0.1.0

Parco Discord
Documentation
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;
}