@@ -40,16 +40,18 @@ pub struct GenerateTypesConfig {
4040pub 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,
0 commit comments