From 8b449d6f002f1d1e24e6916206855e455c25b06b Mon Sep 17 00:00:00 2001 From: afterlifepro Date: Sun, 21 Dec 2025 15:15:15 +0000 Subject: [PATCH] support DATABASE_URL environment variable --- src/config.rs | 44 ++++++++++++++++++++++++++++++++++---------- src/db.rs | 3 +-- src/main.rs | 14 ++++++-------- 3 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/config.rs b/src/config.rs index 784f91b..554811f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -24,15 +24,39 @@ pub static USER: LazyLock> = LazyLock::new(|| { }); pub static POSTGRES_URL: LazyLock = LazyLock::new(|| { - let Ok(user) = env::var("POSTGRES_USER") else { - panic!("POSTGRES_USER was not set. Cannot connect to database") - }; - let Ok(password) = env::var("POSTGRES_PASSWORD") else { - panic!("POSTGRES_PASSWORD was not set. Cannot connect to database") - }; - let Ok(host) = env::var("POSTGRES_HOST") else { - panic!("POSTGRES_HOST was not set. Cannot connect to database") - }; + if let Ok(url) = env::var("DATABASE_URL") { + return url; + } + + let user = env::var("POSTGRES_USER"); + let db = env::var("POSTGRES_DATABASE").or_else(|_| user.clone()); + let password = env::var("POSTGRES_PASSWORD"); + let host = env::var("POSTGRES_HOST"); + + if let Ok(user) = user.clone() + && let Ok(db) = db.clone() + && let Ok(password) = password.clone() + && let Ok(host) = host.clone() + { + format!("postgres://{}:{}@{}/{}", user, password, host, db) + } else { + let missing = [ + (user, "USER"), + (db, "DATABASE"), + (password, "PASSWORD"), + (host, "HOST"), + ] + .iter() + .filter_map(|x| { + if x.0.is_err() { + Some(String::from("POSTGRES_") + x.1) + } else { + None + } + }) + .collect::>() + .join(", "); - format!("postgres://{}:{}@{}/{}", user, password, host, user) + panic!("Could not generate database url. Missing environment variables {}. Set DATABASE_URL to define the postgres url manually", missing); + } }); diff --git a/src/db.rs b/src/db.rs index ec79dba..59d4781 100644 --- a/src/db.rs +++ b/src/db.rs @@ -7,8 +7,7 @@ pub async fn conn() -> Pool { let conn = match PgPool::connect(&config::POSTGRES_URL).await { Ok(val) => val, Err(err) => { - println!("Could not connect to the database. Got error {err}"); - panic!() + panic!("Could not connect to the database. Got error {err}"); } }; diff --git a/src/main.rs b/src/main.rs index a43aadd..ed75e4d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,18 +17,16 @@ async fn main() -> Result<(), Error> { let conn: Pool = db::conn().await; println!("Database connected and initialized"); - let pds = match utils::resolver::resolve(&config::USER).await { - Ok(val) => val, - Err(err) => panic!("{}", err), - }; + let pds = utils::resolver::resolve(&config::USER) + .await + .unwrap_or_else(|err| panic!("{}", err)); println!("Starting backfill"); let timer = std::time::Instant::now(); - if let Err(err) = backfill(&pds, &conn, Some(timer)).await { - println!("{}", err); - return Err(Error); - }; + backfill(&pds, &conn, Some(timer)) + .await + .unwrap_or_else(|err| panic!("{}", err)); println!("Backfill complete. Took {:?}", timer.elapsed()); -- 2.51.2