db-library 0.1.2

A Rust library for listening to database changes and notifying connected backend services.
Documentation
use std::env;

use db_library::{config::DBListenerError, DBConfig, DBListener, EventType, PgNotify};
use dotenv::dotenv;
use tracing::{error, info, Level};
use tracing_subscriber::FmtSubscriber;

fn set_up_tracer() {
    let subscriber = FmtSubscriber::builder()
        .with_max_level(Level::INFO)
        .finish();

    tracing::subscriber::set_global_default(subscriber).expect("setting dfeault subscriber failed");
}

#[tokio::main]
async fn main() -> Result<(), DBListenerError> {
    set_up_tracer();

    let handle = tokio::spawn(async move {
        listener().await.unwrap();
    });

    handle.await.unwrap();

    Ok(())
}

async fn listener() -> Result<(), DBListenerError> {
    dotenv().ok();

    // Get the database URL from the environment variables
    let database_url =
        env::var("POSTGRES_DATABASE_URL").expect("POSTGRES_DATABASE_URL must be set");

    let table_name = "swaps".to_string();
    let columns = vec![
        "initiate_tx_hash".to_string(),
        "redeem_tx_hash".to_string(),
        "refund_tx_hash".to_string(),
    ];

    let table_identifier = "id".to_string();

    let database_config = DBConfig::Postgres {
        url: database_url,
        table_name,
        columns,
        table_identifier,
    };

    let events = vec![EventType::UPDATE, EventType::INSERT, EventType::DELETE];

    let db_listener = DBListener::new(database_config, events).await?;

    db_listener
        .listen(|notification| {
            let pg_notify = serde_json::from_str::<PgNotify>(&notification.to_string());

            if let Err(err) = pg_notify {
                error!("Error deserializing notification : {:#?}", err);
                return;
            }

            let pg_notify = pg_notify.unwrap();

            info!("--> payload received in channel");

            info!("Payload : {:#?}", pg_notify);
        })
        .await?;

    Ok(())
}