#![allow(clippy::all)]
#![allow(noop_method_call)]
use super::traits::Renderable;
#[derive(Clone, Debug, PartialEq, Copy)]
pub enum MessageRole {
User,
Assistant,
System,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ChatMessage {
pub role: MessageRole,
pub content: String,
pub avatar: String,
pub timestamp: String,
}
impl ChatMessage {
#[inline]
pub fn new(content: String) -> ChatMessage {
ChatMessage {
role: MessageRole::User,
content,
avatar: String::from(""),
timestamp: String::from(""),
}
}
#[inline]
pub fn role(mut self, role: MessageRole) -> ChatMessage {
self.role = role;
self
}
#[inline]
pub fn avatar(mut self, avatar: String) -> ChatMessage {
self.avatar = avatar;
self
}
#[inline]
pub fn timestamp(mut self, timestamp: String) -> ChatMessage {
self.timestamp = timestamp;
self
}
}
impl Renderable for ChatMessage {
#[inline]
fn render(self) -> String {
let role_class = match self.role {
MessageRole::User => "wj-message-user".to_string(),
MessageRole::Assistant => "wj-message-assistant".to_string(),
MessageRole::System => "wj-message-system".to_string(),
};
let avatar_html = {
if self.avatar.len() > (0 as usize) {
format!(
"<div class='wj-message-avatar'><img src='{}' alt='avatar'/></div>",
self.avatar
)
} else {
let default_icon = match self.role {
MessageRole::User => "👤".to_string(),
MessageRole::Assistant => "🤖".to_string(),
MessageRole::System => "⚙️".to_string(),
};
format!("<div class='wj-message-avatar'>{}</div>", default_icon)
}
};
let timestamp_html = {
if self.timestamp.len() > (0 as usize) {
format!("<div class='wj-message-timestamp'>{}</div>", self.timestamp)
} else {
String::from("")
}
};
format!(
"<div class='wj-chat-message {}'>
{}
<div class='wj-message-content-wrapper'>
<div class='wj-message-content'>{}</div>
{}
</div>
</div>",
role_class, avatar_html, self.content, timestamp_html
)
}
}