apalis-redis 1.0.0

Background task processing for rust using apalis and redis
Documentation
use apalis_core::backend::{Backend, ListWorkers, RunningWorker};
use redis::Script;

use crate::{RedisStorage, error::Error};

impl<Args: Sync, Conn> ListWorkers for RedisStorage<Args, Conn>
where
    RedisStorage<Args, Conn>: Backend<Error = Error>,
    Args: 'static + Send,
    Conn: redis::aio::ConnectionLike + Sync + Send + Clone,
{
    fn list_workers(&self) -> impl Future<Output = Result<Vec<RunningWorker>, Self::Error>> + Send {
        let config = self.persist.config.clone();
        let mut conn = self.persist.conn.clone();

        async move {
            let worker_metadata_key = format!("{}:workers:", config.queue);
            let json: String = Script::new(include_str!("../../lua/list_workers.lua"))
                .key(config.workers_set())
                .key(worker_metadata_key)
                .invoke_async(&mut conn)
                .await?;
            let workers: Vec<RunningWorker> = serde_json::from_str(&json).map_err(Error::Json)?;

            Ok(workers)
        }
    }

    fn list_all_workers(
        &self,
    ) -> impl Future<Output = Result<Vec<RunningWorker>, Self::Error>> + Send {
        let mut conn = self.persist.conn.clone();

        async move {
            let json: String = Script::new(include_str!("../../lua/list_all_workers.lua"))
                .invoke_async(&mut conn)
                .await?;

            let workers: Vec<RunningWorker> = serde_json::from_str(&json).map_err(Error::Json)?;

            Ok(workers)
        }
    }
}