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