windjammer_ui/components/generated/
chatmessage.rs1#![allow(clippy::all)]
2#![allow(noop_method_call)]
3use super::traits::Renderable;
4
5#[derive(Clone, Debug, PartialEq, Copy)]
6pub enum MessageRole {
7 User,
8 Assistant,
9 System,
10}
11
12#[derive(Debug, Clone, PartialEq)]
13pub struct ChatMessage {
14 pub role: MessageRole,
15 pub content: String,
16 pub avatar: String,
17 pub timestamp: String,
18}
19
20impl ChatMessage {
21 #[inline]
22 pub fn new(content: String) -> ChatMessage {
23 ChatMessage {
24 role: MessageRole::User,
25 content,
26 avatar: String::from(""),
27 timestamp: String::from(""),
28 }
29 }
30 #[inline]
31 pub fn role(mut self, role: MessageRole) -> ChatMessage {
32 self.role = role;
33 self
34 }
35 #[inline]
36 pub fn avatar(mut self, avatar: String) -> ChatMessage {
37 self.avatar = avatar;
38 self
39 }
40 #[inline]
41 pub fn timestamp(mut self, timestamp: String) -> ChatMessage {
42 self.timestamp = timestamp;
43 self
44 }
45}
46
47impl Renderable for ChatMessage {
48 #[inline]
49 fn render(self) -> String {
50 let role_class = match self.role {
51 MessageRole::User => "wj-message-user".to_string(),
52 MessageRole::Assistant => "wj-message-assistant".to_string(),
53 MessageRole::System => "wj-message-system".to_string(),
54 };
55 let avatar_html = {
56 if self.avatar.len() > (0 as usize) {
57 format!(
58 "<div class='wj-message-avatar'><img src='{}' alt='avatar'/></div>",
59 self.avatar
60 )
61 } else {
62 let default_icon = match self.role {
63 MessageRole::User => "👤".to_string(),
64 MessageRole::Assistant => "🤖".to_string(),
65 MessageRole::System => "⚙️".to_string(),
66 };
67 format!("<div class='wj-message-avatar'>{}</div>", default_icon)
68 }
69 };
70 let timestamp_html = {
71 if self.timestamp.len() > (0 as usize) {
72 format!("<div class='wj-message-timestamp'>{}</div>", self.timestamp)
73 } else {
74 String::from("")
75 }
76 };
77 format!(
78 "<div class='wj-chat-message {}'>
79 {}
80 <div class='wj-message-content-wrapper'>
81 <div class='wj-message-content'>{}</div>
82 {}
83 </div>
84 </div>",
85 role_class, avatar_html, self.content, timestamp_html
86 )
87 }
88}