use std::fmt::{Display, Formatter};
use std::ops::Range;
#[cfg(feature = "with-serde")]
use {serde::Deserialize, serde::Serialize};
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
pub struct TwitchUserBasics {
pub id: String,
pub login: String,
pub name: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
pub struct RGBColor {
pub r: u8,
pub g: u8,
pub b: u8,
}
impl Display for RGBColor {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "#{:0>2X}{:0>2X}{:0>2X}", self.r, self.g, self.b)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
pub struct Emote {
pub id: String,
pub char_range: Range<usize>,
pub code: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
pub struct Badge {
pub name: String,
pub version: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
pub struct ReplyParent {
pub message_id: String,
pub reply_parent_user: TwitchUserBasics,
pub message_text: String,
}
pub trait ReplyToMessage {
fn channel_login(&self) -> &str;
fn message_id(&self) -> &str;
}
impl<C, M> ReplyToMessage for (C, M)
where
C: AsRef<str>,
M: AsRef<str>,
{
fn channel_login(&self) -> &str {
self.0.as_ref()
}
fn message_id(&self) -> &str {
self.1.as_ref()
}
}
#[cfg(test)]
mod tests {
use crate::message::{IRCMessage, PrivmsgMessage, ReplyToMessage};
use std::convert::TryFrom;
#[test]
pub fn test_reply_to_message_trait_impl() {
let _a: Box<dyn ReplyToMessage> = Box::new(("asd", "def"));
let _b: Box<dyn ReplyToMessage> = Box::new(("asd".to_owned(), "def"));
let _c: Box<dyn ReplyToMessage> = Box::new(("asd", "def".to_owned()));
let d: Box<dyn ReplyToMessage> = Box::new(("asd".to_owned(), "def".to_owned()));
assert_eq!(d.channel_login(), "asd");
assert_eq!(d.message_id(), "def");
}
fn function_with_impl_arg(a: &impl ReplyToMessage) -> String {
a.message_id().to_owned()
}
#[test]
pub fn test_reply_to_message_trait_for_privmsg() {
let src = "@badge-info=;badges=;color=#0000FF;display-name=JuN1oRRRR;emotes=;flags=;id=e9d998c3-36f1-430f-89ec-6b887c28af36;mod=0;room-id=11148817;subscriber=0;tmi-sent-ts=1594545155039;turbo=0;user-id=29803735;user-type= :jun1orrrr!jun1orrrr@jun1orrrr.tmi.twitch.tv PRIVMSG #pajlada :dank cam";
let irc_message = IRCMessage::parse(src).unwrap();
let msg = PrivmsgMessage::try_from(irc_message).unwrap();
let msg_ref: &PrivmsgMessage = &msg; assert_eq!(msg_ref.channel_login(), "pajlada");
assert_eq!(msg_ref.message_id(), "e9d998c3-36f1-430f-89ec-6b887c28af36");
assert_eq!(
function_with_impl_arg(msg_ref),
"e9d998c3-36f1-430f-89ec-6b887c28af36"
);
}
}