Skip to content

Commit 4e2b81d

Browse files
committed
Add DB_URL support
1 parent 05dc78e commit 4e2b81d

File tree

3 files changed

+85
-32
lines changed

3 files changed

+85
-32
lines changed

src/common/cli.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ pub struct Cli {
5252
#[clap(long)]
5353
pub db_name: Option<String>,
5454

55+
/// Custom database connection URL (overrides individual connection parameters if provided)
56+
#[clap(long)]
57+
pub db_url: Option<String>,
58+
5559
/// PostgreSQL schema search path (default is "$user,public") https://www.postgresql.org/docs/current/ddl-schemas.html#DDL-SCHEMAS-PATH
5660
#[clap(long)]
5761
pub pg_search_path: Option<String>,

src/common/config.rs

Lines changed: 79 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,18 @@ pub struct GenerateTypesConfig {
4040
pub struct DbConnectionConfig {
4141
#[serde(rename = "DB_TYPE")]
4242
pub db_type: DatabaseType,
43-
#[serde(rename = "DB_HOST")]
43+
#[serde(rename = "DB_HOST", default)]
4444
pub db_host: String,
45-
#[serde(rename = "DB_PORT")]
45+
#[serde(rename = "DB_PORT", default)]
4646
pub db_port: u16,
47-
#[serde(rename = "DB_USER")]
47+
#[serde(rename = "DB_USER", default)]
4848
pub db_user: String,
4949
#[serde(rename = "DB_PASS")]
5050
pub db_pass: Option<String>,
5151
#[serde(rename = "DB_NAME")]
5252
pub db_name: Option<String>,
53+
#[serde(rename = "DB_URL")]
54+
pub db_url: Option<String>,
5355
#[serde(rename = "PG_SEARCH_PATH")]
5456
pub pg_search_path: Option<String>,
5557
#[serde(rename = "POOL_SIZE", default = "default_pool_size")]
@@ -218,43 +220,77 @@ impl Config {
218220
panic!("")
219221
});
220222

221-
let db_host = &CLI_ARGS
222-
.db_host
223+
// Check if a custom DB_URL is provided
224+
let db_url = &CLI_ARGS
225+
.db_url
223226
.clone()
224-
.or_else(|| dotenv.db_host.clone())
225-
.or_else(|| default_config.map(|x| x.db_host.clone()))
226-
.expect(
227-
r"
227+
.or_else(|| dotenv.db_url.clone())
228+
.or_else(|| default_config.map(|x| x.db_url.clone()).flatten());
229+
230+
// If DB_URL is provided, we don't require individual connection parameters
231+
let db_host = if db_url.is_some() {
232+
CLI_ARGS
233+
.db_host
234+
.clone()
235+
.or_else(|| dotenv.db_host.clone())
236+
.or_else(|| default_config.map(|x| x.db_host.clone()))
237+
.unwrap_or_default()
238+
} else {
239+
CLI_ARGS
240+
.db_host
241+
.clone()
242+
.or_else(|| dotenv.db_host.clone())
243+
.or_else(|| default_config.map(|x| x.db_host.clone()))
244+
.expect(
245+
r"
228246
Failed to fetch DB host.
229247
Please provide it at least through a CLI arg or an environment variable or through
230-
file based configuration
248+
file based configuration, or provide a custom DB_URL
231249
",
232-
);
233-
234-
let db_port = &CLI_ARGS
235-
.db_port
236-
.or(dotenv.db_port)
237-
.or_else(|| default_config.map(|x| x.db_port))
238-
.expect(
239-
r"
250+
)
251+
};
252+
253+
let db_port = if db_url.is_some() {
254+
CLI_ARGS
255+
.db_port
256+
.or(dotenv.db_port)
257+
.or_else(|| default_config.map(|x| x.db_port))
258+
.unwrap_or_default()
259+
} else {
260+
CLI_ARGS
261+
.db_port
262+
.or(dotenv.db_port)
263+
.or_else(|| default_config.map(|x| x.db_port))
264+
.expect(
265+
r"
240266
Failed to fetch DB port.
241267
Please provide it at least through a CLI arg or an environment variable or through
242-
file based configuration
268+
file based configuration, or provide a custom DB_URL
243269
",
244-
);
270+
)
271+
};
245272

246-
let db_user = &CLI_ARGS
247-
.db_user
248-
.clone()
249-
.or_else(|| dotenv.db_user.clone())
250-
.or_else(|| default_config.map(|x| x.db_user.clone()))
251-
.expect(
252-
r"
273+
let db_user = if db_url.is_some() {
274+
CLI_ARGS
275+
.db_user
276+
.clone()
277+
.or_else(|| dotenv.db_user.clone())
278+
.or_else(|| default_config.map(|x| x.db_user.clone()))
279+
.unwrap_or_default()
280+
} else {
281+
CLI_ARGS
282+
.db_user
283+
.clone()
284+
.or_else(|| dotenv.db_user.clone())
285+
.or_else(|| default_config.map(|x| x.db_user.clone()))
286+
.expect(
287+
r"
253288
Failed to fetch DB user.
254289
Please provide it at least through a CLI arg or an environment variable or through
255-
file based configuration
290+
file based configuration, or provide a custom DB_URL
256291
",
257-
);
292+
)
293+
};
258294

259295
let db_pass = &CLI_ARGS
260296
.db_pass
@@ -286,11 +322,12 @@ impl Config {
286322

287323
DbConnectionConfig {
288324
db_type: db_type.to_owned(),
289-
db_host: db_host.to_owned(),
290-
db_port: db_port.to_owned(),
291-
db_user: db_user.to_owned(),
325+
db_host,
326+
db_port,
327+
db_user,
292328
db_pass: db_pass.to_owned(),
293329
db_name: db_name.to_owned(),
330+
db_url: db_url.to_owned(),
294331
pg_search_path: pg_search_path.to_owned(),
295332
pool_size,
296333
connection_timeout,
@@ -332,6 +369,11 @@ impl Config {
332369
/// This is to follow the spec of connection string for MySQL
333370
/// https://dev.mysql.com/doc/connector-j/8.1/en/connector-j-reference-jdbc-url-format.html
334371
pub fn get_mysql_cred_str(&self, conn: &DbConnectionConfig) -> String {
372+
// If custom DB_URL is provided, use it directly
373+
if let Some(db_url) = &conn.db_url {
374+
return db_url.to_owned();
375+
}
376+
335377
format!(
336378
"mysql://{user}:{pass}@{host}:{port}/{db_name}",
337379
user = &conn.db_user,
@@ -344,6 +386,11 @@ impl Config {
344386
}
345387

346388
pub fn get_postgres_cred(&self, conn: &DbConnectionConfig) -> String {
389+
// If custom DB_URL is provided, use it directly
390+
if let Some(db_url) = &conn.db_url {
391+
return db_url.to_owned();
392+
}
393+
347394
format!(
348395
"postgresql://{user}:{pass}@{host}:{port}/{db_name}",
349396
user = &conn.db_user,

src/common/dotenv.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ pub struct Dotenv {
99
pub db_port: Option<u16>,
1010
pub db_pass: Option<String>,
1111
pub db_name: Option<String>,
12+
pub db_url: Option<String>,
1213
pub pg_search_path: Option<String>,
1314
}
1415

@@ -44,6 +45,7 @@ impl Dotenv {
4445
db_port: Self::get_var("DB_PORT").map(|val| val.parse::<u16>().expect("DB_PORT is not a valid integer")),
4546
db_pass: Self::get_var("DB_PASS"),
4647
db_name: Self::get_var("DB_NAME"),
48+
db_url: Self::get_var("DB_URL"),
4749
pg_search_path: Self::get_var("PG_SEARCH_PATH"),
4850
}
4951
}

0 commit comments

Comments
 (0)