driftdb 0.1.4

A real-time data backend for browser-based applications (core library).
Documentation
use crate::{
    db::DatabaseInner,
    types::{MessageFromDatabase, MessageToDatabase},
};
use std::sync::{Arc, Mutex, Weak};

pub struct Connection {
    pub callback: Arc<Box<dyn Fn(&MessageFromDatabase) + Send + Sync>>,
    database: Weak<Mutex<DatabaseInner>>,
}

impl Connection {
    pub fn new<F>(callback: F, database: Arc<Mutex<DatabaseInner>>) -> Connection
    where
        F: Fn(&MessageFromDatabase) + 'static + Send + Sync,
    {
        Connection {
            callback: Arc::new(Box::new(callback)),
            database: Arc::downgrade(&database),
        }
    }

    pub fn send_message(&self, message: &MessageToDatabase) -> Result<(), &str> {
        if let Some(response) = self
            .database
            .upgrade()
            .unwrap()
            .lock()
            .unwrap()
            .send_message(message)
        {
            (self.callback)(&response);
        };

        Ok(())
    }
}