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();
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>(¬ification.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(())
}