Documentation
use crate::message::MessageElement;
use ricq::msg::{MessageElem, PushElem};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Clone)]
pub struct At {
    pub target: i64,
    pub display: String,
}

impl At {
    pub const ALL: Self = Self {
        target: 0,
        display: String::new(),
    };

    pub fn all() -> Self {
        Self::ALL
    }
}

impl From<At> for ricq::msg::elem::At {
    fn from(At { target, display }: At) -> Self {
        Self { target, display }
    }
}

impl PushElem for At {
    fn push_to(elem: Self, vec: &mut Vec<MessageElem>) {
        let At { target, display } = elem;

        let rq = ricq::msg::elem::At { target, display };
        PushElem::push_to(rq, vec);
    }
}

impl From<At> for MessageElement {
    fn from(at: At) -> Self {
        Self::At(at)
    }
}