use ricq::msg::{
elem::{self, RQElem},
MessageChain, MessageChainBuilder,
};
#[derive(Debug, Default, Clone)]
pub struct MessageContent {
inner: MessageChain,
}
impl MessageContent {
pub(crate) fn into_inner(self) -> MessageChain {
self.inner
}
pub fn segments(&self) -> impl Iterator<Item = RQElem> + '_ {
self.inner.0.iter().map(|elem| elem.clone().into())
}
pub fn into_segments(self) -> impl Iterator<Item = RQElem> {
self.inner.0.into_iter().map(|elem| elem.into())
}
}
#[derive(Default, Debug, Clone)]
pub struct MessageContentBuilder {
pub(crate) inner: MessageChainBuilder,
}
impl MessageContentBuilder {
pub fn new() -> Self {
Default::default()
}
pub fn build(self) -> MessageContent {
MessageContent {
inner: self.inner.build(),
}
}
pub fn push<T: MessageSegment>(mut self, segment: T) -> Self {
segment.push_to(&mut self);
self
}
}
pub trait MessageSegment {
fn push_to(self, builder: &mut MessageContentBuilder);
}
macro_rules! impl_message_segment {
($($ty:ty),*) => {
$(
impl MessageSegment for $ty {
fn push_to(self, builder: &mut MessageContentBuilder) {
builder.inner.push(self);
}
}
)*
};
}
impl_message_segment!(elem::At);
impl_message_segment!(elem::Face);
impl_message_segment!(elem::FriendImage);
impl_message_segment!(elem::GroupImage);
impl MessageSegment for String {
fn push_to(self, builder: &mut MessageContentBuilder) {
builder.inner.push_str(&self);
}
}
impl MessageSegment for &str {
fn push_to(self, builder: &mut MessageContentBuilder) {
builder.inner.push_str(self);
}
}
#[macro_export]
macro_rules! msg {
($($elem:expr),* $(,)?) => {
$crate::message::MessageContentBuilder::new()
$(
.push($elem)
)*
.build()
};
}