use super::traits::Renderable
pub enum MessageRole {
User,
Assistant,
System,
}
pub struct ChatMessage {
role: MessageRole,
content: string,
avatar: string,
timestamp: string,
}
impl ChatMessage {
pub fn new(content: string) -> ChatMessage {
ChatMessage {
role: MessageRole::User,
content: content,
avatar: String::from(""),
timestamp: String::from(""),
}
}
pub fn role(self, role: MessageRole) -> ChatMessage {
self.role = role
self
}
pub fn avatar(self, avatar: string) -> ChatMessage {
self.avatar = avatar
self
}
pub fn timestamp(self, timestamp: string) -> ChatMessage {
self.timestamp = timestamp
self
}
}
impl Renderable for ChatMessage {
pub fn render(self) -> string {
let role_class = match self.role {
MessageRole::User => "wj-message-user",
MessageRole::Assistant => "wj-message-assistant",
MessageRole::System => "wj-message-system",
}
let avatar_html = if self.avatar.len() > 0 {
format!("<div class='wj-message-avatar'><img src='{}' alt='avatar'/></div>", self.avatar)
} else {
let default_icon = match self.role {
MessageRole::User => "👤",
MessageRole::Assistant => "🤖",
MessageRole::System => "⚙️",
}
format!("<div class='wj-message-avatar'>{}</div>", default_icon)
}
let timestamp_html = if self.timestamp.len() > 0 {
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
)
}
}