windjammer-ui 0.3.6

Cross-platform UI framework for Windjammer (Web, Desktop, Mobile)
Documentation
#![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
        )
    }
}