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_config::DriverConfig;
use crate::models::message::Message;
use async_trait::async_trait;
use ormlite::sqlite::SqliteConnection;
use ratatui::prelude::Color;

#[async_trait]
pub trait MessagingDriver : Send + Sync {
    type Config: DriverConfig + Sized + Clone;

    async fn new(config: Self::Config) -> anyhow::Result<Self> where Self: Sized;
    fn config(&self) -> &Self::Config;
    fn name(&self) -> &str;
    fn icon(&self) -> &str;
    fn color(&self) -> Color;
    async fn send_message(&mut self, db: &mut SqliteConnection, message: &Message) -> anyhow::Result<()>;
    async fn active_poll_received_messages(&mut self, db: &mut SqliteConnection) -> anyhow::Result<()>;
    async fn passive_poll_received_messages(&mut self, db: &mut SqliteConnection) -> anyhow::Result<()>;
}

#[async_trait]
pub trait ErasedMessagingDriver : Send + Sync {
    fn config(&self) -> &dyn DriverConfig;
    fn name(&self) -> &str;
    fn icon(&self) -> &str;
    fn color(&self) -> Color;
    async fn send_message(&mut self, db: &mut SqliteConnection, message: &Message) -> anyhow::Result<()>;
    async fn active_poll_received_messages(&mut self, db: &mut SqliteConnection) -> anyhow::Result<()>;
    async fn passive_poll_received_messages(&mut self, db: &mut SqliteConnection) -> anyhow::Result<()>;
}

#[async_trait]
impl<T: MessagingDriver + Send + Sync> ErasedMessagingDriver for T {
    fn config(&self) -> &dyn DriverConfig {
        self.config()
    }

    fn name(&self) -> &str {
        MessagingDriver::name(self)
    }

    fn icon(&self) -> &str {
        MessagingDriver::icon(self)
    }

    fn color(&self) -> Color {
        MessagingDriver::color(self)
    }

    async fn send_message(&mut self, db: &mut SqliteConnection, message: &Message) -> anyhow::Result<()> {
        MessagingDriver::send_message(self, db, message).await
    }

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