use actix::{Actor, Addr, Context, Handler}; use uuid::Uuid; use crate::client_management::chat_manager::{ message_type::Message, messages::{ChatManagerDataMessage, ChatManagerDataResponse, ChatManagerMessage}, }; pub(crate) struct ChatManager { messages: Vec, } impl ChatManager { pub fn new() -> Addr { Self { messages: Vec::new(), } .start() } // no need for a remove methods because this is a read only system fn add_message(&mut self, _ctx: &mut Context, id: Uuid, content: String) { self.messages.push(Message::new(id, content)) } fn get_messages(&self, _ctx: &mut Context) -> ChatManagerDataResponse { ChatManagerDataResponse::GotMessages(self.messages.clone()) } fn get_message( &self, _ctx: &mut Context, index: usize, ) -> ChatManagerDataResponse { ChatManagerDataResponse::GotMessage(self.messages.get(index).cloned()) } } impl Actor for ChatManager { type Context = Context; } impl Handler for ChatManager { type Result = (); fn handle(&mut self, msg: ChatManagerMessage, ctx: &mut Self::Context) -> Self::Result { match msg { ChatManagerMessage::AddMessage(id, content) => self.add_message(ctx, id, content), } } } impl Handler for ChatManager { type Result = ChatManagerDataResponse; fn handle( &mut self, msg: ChatManagerDataMessage, ctx: &mut Self::Context, ) -> Self::Result { match msg { ChatManagerDataMessage::GetMessages => self.get_messages(ctx), ChatManagerDataMessage::GetMessage(index) => self.get_message(ctx, index), } } }