apalis-pgmq 0.1.0-rc.4

Background task processing for rust using apalis and pgmq
Documentation
use std::{env, io};

use apalis::prelude::*;
use apalis_pgmq::*;
use facet::Facet;

struct FacetMsgPack;

impl<T: Facet<'static>> Codec<T> for FacetMsgPack {
    type Compact = Vec<u8>;
    type Error = io::Error;
    fn encode(val: &T) -> Result<Self::Compact, Self::Error> {
        Ok(facet_msgpack::to_vec(val).unwrap())
    }

    fn decode(val: &Self::Compact) -> Result<T, Self::Error> {
        Ok(facet_msgpack::from_slice(val).unwrap())
    }
}

#[derive(Facet)]
struct Reminder {
    to: String,
}

#[tokio::main]
async fn main() {
    let pool = PgPool::connect(env::var("DATABASE_URL").unwrap().as_str())
        .await
        .unwrap();

    PGMQueue::setup(&pool).await.unwrap();
    let config = Config::default()
        .with_queue("facet_msgpack")
        .with_codec::<FacetMsgPack>();
    let mut backend = PGMQueue::new_with_config(pool, config).await;

    backend
        .push(Reminder {
            to: "example@email.local".to_owned(),
        })
        .await
        .unwrap();

    async fn send_reminder(reminder: Reminder, wrk: WorkerContext) -> Result<(), BoxDynError> {
        println!("Sending reminder to {}", reminder.to);
        wrk.stop()?;
        Ok(())
    }

    let worker = WorkerBuilder::new("rango-tango-1")
        .backend(backend)
        .build(send_reminder);
    worker.run().await.unwrap();
}