mayday 0.1.0

A multi-messaging-sevice aggregator into an all-in-one application (android's app beeper-like)
Documentation
use crate::models::driver::ErasedMessagingDriver;
use crate::models::message::Message;
use chrono::Local;
use ormlite::Model;
use ormlite::sqlite::SqliteConnection;
use regex::Regex;
use uuid::Uuid;

pub struct MessagingService {
    pub uuid: Uuid,
    pub discussion_name: String,
    pub tmp_messages: Vec<Message>,
    pub driver: Box<dyn ErasedMessagingDriver>
}

impl MessagingService {
    pub async fn try_load_messages(&mut self, db: &mut SqliteConnection) -> anyhow::Result<bool> {
        let messages = Message::select().fetch_all(db).await?;
        
        if self.tmp_messages.len() == messages.len() {
            Ok(false)
        }
        else {
            self.tmp_messages = messages;
            Ok(true)
        }
    }

    pub async fn send_message(&mut self, db: &mut SqliteConnection, text: String) -> anyhow::Result<()> {
        let text = text.trim();

        let regex = Regex::new("[\r\n]+")?;
        let text = regex.replace_all(text, "\n").to_string();

        let message = Message {
            sender: None,
            text,
            timestamp: Local::now(),
        };

        self.driver.send_message(db, &message).await?;
        message.clone().insert(db).await?;
        self.tmp_messages.push(message.clone());

        Ok(())
    }

    pub async fn active_poll_received_messages(&mut self, db: &mut SqliteConnection) -> anyhow::Result<()> {
        self.driver.active_poll_received_messages(db).await
    }
    
    pub async fn passive_poll_received_messages(&mut self, db: &mut SqliteConnection) -> anyhow::Result<()> {
        self.driver.passive_poll_received_messages(db).await
    }
}